vue3組合API中setup、 ref、reactive的使用大全
1.初識(shí)setUp的使用
簡(jiǎn)單介紹下面的代碼功能:
使用ref函數(shù),去使用監(jiān)聽某一個(gè)變量的變化,并且把它渲染到視圖上。
setUp函數(shù)是組合API的入口函數(shù)。這個(gè)是非常重要的。
setUp可以去監(jiān)聽變量的變化哈!我們將會(huì)利用它
ref 在vue中內(nèi)置,需要導(dǎo)入。
<template> <div>{{ countNum}}</div> <button @click="handerFunc">按鈕</button> </template> <script> import {ref} from 'vue' export default { name: 'App', setup() { // 這一句表示的是定義了一個(gè)變量count。這個(gè)變量的初始值是100 let countNum=ref(100); // 在組合API中,如果想定義一個(gè)方法,不用定義到methods中去。直接定義就可以了 function handerFunc(){ // console.log(countNum);//countNum是一個(gè)對(duì)象 countNum.value += 10; } //在組合api中定義的方法,或者變量。如果外界需要使用,那么必須通過(guò) return {aaa,func} 的方式暴露出去 return { countNum ,handerFunc} } } </script>
2認(rèn)識(shí)reactive的使用
ref函數(shù)只能夠去監(jiān)聽簡(jiǎn)單類型的數(shù)據(jù)變化。
不能夠去監(jiān)聽,復(fù)雜類型的變化(數(shù)組、對(duì)象)。
所以我們的主角reactive就出現(xiàn)了。
setup 中的函數(shù)會(huì)自動(dòng)執(zhí)行一次。
<template> <div> <ul> <li v-for="item in satte.arr" :key="item.id"> {{item.name }} </li> </ul> </div> </template> <script> import {reactive} from 'vue' export default { name: 'App', setup(){ console.log("setUp會(huì)自動(dòng)執(zhí)行的") // ref函數(shù)的注意點(diǎn): // ref函數(shù)只能夠去監(jiān)聽簡(jiǎn)單類型的數(shù)據(jù)變化,不能夠去監(jiān)聽,復(fù)雜類型的變化(數(shù)組、對(duì)象) // reactive 方法里面是一個(gè)對(duì)象 let satte=reactive({ arr:[ {name:"司藤",id:'0011'}, {name:"皮囊之下",id:'0011'}, {name:"百歲之約",id:'0012'}, {name:"三生三世",id:'0013'}, ] }) return { satte } }, } </script>
3使用reactive
實(shí)現(xiàn)視圖的刪除
<template> <div> <ul> <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)"> {{item.name }} </li> </ul> </div> </template> <script> import {reactive} from 'vue' export default { name: 'App', setup(){ let satte=reactive({ arr:[ {name:"司藤",id:'0011'}, {name:"皮囊之下",id:'0011'}, {name:"百歲之約",id:'0012'}, {name:"三生三世",id:'0013'}, ] }) // 刪除被點(diǎn)擊的元素 function del(index){ for(let i=0;i<satte.arr.length;i++){ if(index==i){ satte.arr.splice(i,1) } } } return { satte, del} }, } </script>
4將刪除的邏輯分離出去
形成一個(gè)單獨(dú)的模塊
<template> <div> <ul> <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)"> {{item.name }} </li> </ul> </div> </template> <script> import {reactive} from 'vue' export default { name: 'App', setup(){ // onlyDelLuoJi() 方法中含有一個(gè)數(shù)組 和一個(gè)方法;類似于解構(gòu) let {satte,del }=onlyDelLuoJi(); // 暴露給外界使用 return { satte,del} }, } function onlyDelLuoJi(){ let satte=reactive({ arr:[ {name:"司藤",id:'0011'}, {name:"皮囊之下",id:'0011'}, {name:"百歲之約",id:'0012'}, {name:"三生三世",id:'0013'}, ] }) // 刪除被點(diǎn)擊的元素 function del(index){ for(let i=0;i<satte.arr.length;i++){ if(index==i){ satte.arr.splice(i,1) } } } // 將數(shù)據(jù)satte 和方法 del 暴露出去 return { satte,del } } </script>
5. 實(shí)現(xiàn)添加功能
事件之間傳遞參數(shù)
<template> <div> <div> <input type="text" v-model="addobj.watchTv.name"> <button @click="addHander">添加</button> </div> <ul> <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)"> {{item.name }} </li> </ul> </div> </template> <script> import {reactive} from 'vue' export default { name: 'App', setup(){ // onlyDelLuoJi() 方法中含有一個(gè)數(shù)組 和一個(gè)方法;類似于解構(gòu) let {satte,del }=onlyDelLuoJi(); // 傳遞參數(shù)satte 是onlyDelLuoJi函數(shù)中提供的satte。進(jìn)行傳遞 let { addobj,addHander }=OnlyaddHander(satte); // 暴露給外界使用 return { satte,del,addobj, addHander} }, } //添加功能模塊 function OnlyaddHander(satte){ console.log('初始化添加',satte) let addobj=reactive({ watchTv:{ name:"", id:"" } }); function addHander(){ // 重置清空 錯(cuò)吳做法 // satte.arr.push(addobj.watchTv) // addobj.watchTv.name = ""; // addobj.watchTv.id = ""; // 正確做法 let oldobj = Object.assign({}, addobj.watchTv) satte.arr.push(oldobj) } return { addobj,addHander } } //刪除功能模塊 function onlyDelLuoJi(){ console.log('刪除初始化') let satte=reactive({ arr:[ {name:"司藤",id:'0011'}, {name:"皮囊之下",id:'0011'}, {name:"百歲之約",id:'0012'}, {name:"三生三世",id:'0013'}, ] }) // 刪除被點(diǎn)擊的元素 function del(index){ for(let i=0;i<satte.arr.length;i++){ if(index==i){ satte.arr.splice(i,1) } } } // 將數(shù)據(jù)satte 和方法 del 暴露出去 return { satte,del } } </script>
6 將他們抽離成單獨(dú)的文件
我們想在想將添加刪除相關(guān)的邏輯,單獨(dú)抽離成一個(gè)文件。
add.js 是添加相關(guān)的邏輯
del.js 是刪除的相關(guān)邏輯
import { reactive } from "vue" function OnlyaddHander(satte){ console.log('初始化添加',satte) let addobj=reactive({ watchTv:{ name:"", id:"" } }); function addHander(e){ // 重置清空 錯(cuò)吳做法 // satte.arr.push(addobj.watchTv) // addobj.watchTv.name = ""; // addobj.watchTv.id = ""; // 正確做法 let oldobj = Object.assign({}, addobj.watchTv) satte.arr.push(oldobj) e.preventDefault(); } return { addobj,addHander } } export default OnlyaddHander
adel.js
import {reactive } from "vue" function onlyDelLuoJi() { console.log('刪除初始化') let satte=reactive({ arr:[ {name:"司藤",id:'0011'}, {name:"皮囊之下",id:'0011'}, {name:"百歲之約",id:'0012'}, {name:"三生三世",id:'0013'}, ] }) // 刪除被點(diǎn)擊的元素 function del(index){ for(let i=0;i<satte.arr.length;i++){ if(index==i){ satte.arr.splice(i,1) } } } // 將數(shù)據(jù)satte 和方法 del 暴露出去 return { satte,del } } export default onlyDelLuoJi
主文件
<template> <div> <div> <input type="text" v-model="addobj.watchTv.name"> <button @click="addHander">添加</button> </div> <ul> <li v-for="(item,index) in satte.arr" :key="index" @click="del(index)"> {{item.name }} </li> </ul> </div> </template> <script> import onlyDelLuoJi from "./components/del" import OnlyaddHander from "./components/add" export default { name: 'App', setup(){ // onlyDelLuoJi() 方法中含有一個(gè)數(shù)組 和一個(gè)方法;類似于解構(gòu) let {satte,del }=onlyDelLuoJi(); // 傳遞參數(shù) let { addobj,addHander }=OnlyaddHander(satte); // 暴露給外界使用 return { satte,del,addobj, addHander} }, } </script>
以上就是vue3組合API中setup、 ref、reactive的用法的詳細(xì)內(nèi)容,更多關(guān)于vue組合API的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一文搞懂vue中provide和inject實(shí)現(xiàn)原理對(duì)抗平庸
這篇文章主要為大家介紹了vue中provide和inject實(shí)現(xiàn)原理的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04解決vue 退出動(dòng)畫無(wú)效的問(wèn)題
這篇文章主要介紹了解決vue 退出動(dòng)畫無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08詳解解決使用axios發(fā)送json后臺(tái)接收不到的問(wèn)題
這篇文章主要介紹了詳解解決使用axios發(fā)送json后臺(tái)接收不到的問(wèn)題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06解讀vue生成的文件目錄結(jié)構(gòu)及說(shuō)明
本篇文章主要介紹了解讀vue生成的文件目錄結(jié)構(gòu)及說(shuō)明,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Vue使用Axios進(jìn)行跨域請(qǐng)求的方法詳解
在開發(fā)現(xiàn)代?Web?應(yīng)用時(shí),前端和后端通常分離部署在不同的服務(wù)器上,這就會(huì)引發(fā)跨域請(qǐng)求問(wèn)題,所以本文將詳細(xì)介紹如何在?Vue?項(xiàng)目中使用?Axios?發(fā)起跨域請(qǐng)求時(shí)解決跨域問(wèn)題的相關(guān)資料,需要的朋友可以參考下2024-09-09Vue中關(guān)于computed計(jì)算屬性的妙用
這篇文章主要介紹了Vue中關(guān)于computed計(jì)算屬性的妙用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11VueJs里利用CryptoJs實(shí)現(xiàn)加密及解密的方法示例
這篇文章主要介紹了VueJs里利用CryptoJs實(shí)現(xiàn)加密及解密的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04