Vue?CompositionAPI中watch和watchEffect的區(qū)別詳解
watch
偵聽(tīng)一個(gè)數(shù)據(jù)
【例1: watch
偵聽(tīng)ref
基礎(chǔ)類型的數(shù)據(jù)】
const app = Vue.createApp({ setup() { const { ref,watch } = Vue; const name = ref('LeBrown') watch(name,(currentVal,preVal) => { console.log(currentVal,preVal); }) return {name} }, template: ` <div> <div> Name: <input v-model="name"/> </div> <div> Name is: {{name}} </div> </div> ` }) const vm = app.mount('#root')
【例2: watch
偵聽(tīng)reactive
類型的數(shù)據(jù)】
const app = Vue.createApp({ setup() { const { reactive,watch,toRefs} = Vue; const nameObj = reactive({name:'LeBrown'}) watch(()=> nameObj.name,(currentVal,preVal) => { console.log(currentVal,preVal); }) const {name} = toRefs(nameObj) return {name} }, template: ` <div> <div> Name: <input v-model="name"/> </div> <div> Name is: {{name}} </div> </div> ` }) const vm = app.mount('#root')
【備注】
watch
具備一定的惰性 lazy (wath偵聽(tīng)器首次加載不會(huì)執(zhí)行,只有數(shù)據(jù)發(fā)生變化才會(huì)執(zhí)行)watch
中的參數(shù)可以拿到原始值(回調(diào)函數(shù)的第一個(gè)參數(shù))和當(dāng)前值(回調(diào)函數(shù)的第二個(gè)參數(shù))watch
可以偵聽(tīng)ref
基礎(chǔ)類型的數(shù)據(jù),也可以對(duì)reactive
類型的數(shù)據(jù)進(jìn)行監(jiān)聽(tīng)(watch的第一個(gè)參數(shù)要寫成函數(shù)的形式,函數(shù)里面寫要監(jiān)聽(tīng)值或?qū)ο蟮膶傩?
偵聽(tīng)多個(gè)數(shù)據(jù)
【例1】
const app = Vue.createApp({ setup() { const { reactive,watch,toRefs} = Vue; const nameObj = reactive({name:'LeBrown',englishname:'James'}) watch([()=> nameObj.name,()=> nameObj.englishname],([curName,curEng],[prevName,prevEng]) => { console.log(curName,curEng); console.log(prevName,prevEng); }) const {name,englishname} = toRefs(nameObj) return {name,englishname} }, template: ` <div> <div> Name: <input v-model="name"/> </div> <div> Name is: {{name}} </div> <div> EnglishName: <input v-model="englishname"/> </div> <div> Name is: {{englishname}} </div> </div> ` }) const vm = app.mount('#root')
【備注】
watch
可以偵聽(tīng)多個(gè)數(shù)據(jù)的變化(watch的第一個(gè)參數(shù)是一個(gè)數(shù)組,第二個(gè)參數(shù)是一個(gè)函數(shù),函數(shù)的參數(shù)是數(shù)組),用一個(gè)偵聽(tīng)器承載
watchEffect
【例1】
const app = Vue.createApp({ setup() { const { reactive, watchEffect, toRefs } = Vue; const nameObj = reactive({ name: 'LeBrown', englishname: 'James' }) watchEffect(()=>{ console.log(nameObj.name); }) const { name, englishname } = toRefs(nameObj) return { name, englishname } }, template: ` <div> <div> Name: <input v-model="name"/> </div> <div> Name is: {{name}} </div> <div> EnglishName: <input v-model="englishname"/> </div> <div> Name is: {{englishname}} </div> </div> ` }) const vm = app.mount('#root')
【運(yùn)行結(jié)果】
【備注】
watchEffect
會(huì)立即執(zhí)行immediate
,沒(méi)有惰性(wath偵聽(tīng)器首次加載就執(zhí))watchEffect
發(fā)現(xiàn)偵聽(tīng)器中的代碼對(duì)外部有依賴,就會(huì)對(duì)其進(jìn)行偵聽(tīng),如果依賴的值發(fā)生變化,就會(huì)執(zhí)行偵聽(tīng)器中的代碼,也就是說(shuō)它不需要傳遞你要偵聽(tīng)的內(nèi)容,自動(dòng)會(huì)感知代碼依賴,不需要傳遞很多參數(shù),只需要傳遞一個(gè)回調(diào)函數(shù)watchEffect
只能獲取到當(dāng)前的值,不能獲取到之前的值
【總結(jié)】
watch
和watchEffect
都是具備偵聽(tīng)能力的語(yǔ)法,但是在使用時(shí)還是有區(qū)別的。比如:在代碼中要寫ajax
請(qǐng)求的時(shí)候,一般不會(huì)用到之前的數(shù)據(jù),只會(huì)用到當(dāng)前的數(shù)據(jù),結(jié)合當(dāng)前的數(shù)據(jù)發(fā)送請(qǐng)求,這種情況下使用watchEffect
來(lái)發(fā)送ajax
就比較合適setup
是純函數(shù),給固定的輸入就會(huì)有固定的輸出,但是涉及到異步請(qǐng)求或者定時(shí)器,輸出和輸入就不是純函數(shù),導(dǎo)致它不是純函數(shù)的異步請(qǐng)求叫Effect(副作用),因此從名字上看在處理異步的操作的時(shí)候,最好使用watchEffect
其他
取消偵聽(tīng)器
const app = Vue.createApp({ setup() { const { reactive, watchEffect, toRefs } = Vue; const nameObj = reactive({ name: 'LeBrown', englishname: 'James' }) const stop = watchEffect(()=>{ console.log(nameObj.name); console.log(nameObj.englishname); setTimeout(() => { // 取消偵聽(tīng)器 stop() }, 3000); }) const { name, englishname } = toRefs(nameObj) return { name, englishname } }, template: ` <div> <div> Name: <input v-model="name"/> </div> <div> Name is: {{name}} </div> <div> EnglishName: <input v-model="englishname"/> </div> <div> Name is: {{englishname}} </div> </div> ` }) const vm = app.mount('#root')
取消watch偵聽(tīng)器也是一樣
讓watch變成非惰性
watch的第三個(gè)參數(shù)可以通過(guò){immediate: true}
對(duì)偵聽(tīng)器進(jìn)行配置,這樣wath偵聽(tīng)器就變成非惰性了
到此這篇關(guān)于Vue CompositionAPI中watch和watchEffect的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Vue watch watchEffect內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue遞歸組件實(shí)戰(zhàn)之簡(jiǎn)單樹(shù)形控件實(shí)例代碼
這篇文章主要介紹了vue遞歸組件實(shí)戰(zhàn)之簡(jiǎn)單樹(shù)形控件的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08vue3+vite中開(kāi)發(fā)環(huán)境與生產(chǎn)環(huán)境全局變量配置指南
最近在使用vite生成項(xiàng)目,這篇文章主要給大家介紹了關(guān)于vue3+vite中開(kāi)發(fā)環(huán)境與生產(chǎn)環(huán)境全局變量配置的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08vue+element實(shí)現(xiàn)手機(jī)號(hào)驗(yàn)證碼注冊(cè)的示例
本文主要介紹了vue+element實(shí)現(xiàn)手機(jī)號(hào)驗(yàn)證碼注冊(cè)的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01vue3中路由傳參query、params及動(dòng)態(tài)路由傳參詳解
vue3中的傳參方式和vue2中一樣,都可以用query和params傳參,下面這篇文章主要給大家介紹了關(guān)于vue3中路由傳參query、params及動(dòng)態(tài)路由傳參的相關(guān)資料,需要的朋友可以參考下2022-09-09