Vue?CompositionAPI中watch和watchEffect的區(qū)別詳解
watch
偵聽一個數(shù)據(jù)
【例1: watch偵聽ref基礎類型的數(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偵聽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偵聽器首次加載不會執(zhí)行,只有數(shù)據(jù)發(fā)生變化才會執(zhí)行)watch中的參數(shù)可以拿到原始值(回調(diào)函數(shù)的第一個參數(shù))和當前值(回調(diào)函數(shù)的第二個參數(shù))watch可以偵聽ref基礎類型的數(shù)據(jù),也可以對reactive類型的數(shù)據(jù)進行監(jiān)聽(watch的第一個參數(shù)要寫成函數(shù)的形式,函數(shù)里面寫要監(jiān)聽值或?qū)ο蟮膶傩?
偵聽多個數(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可以偵聽多個數(shù)據(jù)的變化(watch的第一個參數(shù)是一個數(shù)組,第二個參數(shù)是一個函數(shù),函數(shù)的參數(shù)是數(shù)組),用一個偵聽器承載
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')【運行結(jié)果】

【備注】
watchEffect會立即執(zhí)行immediate,沒有惰性(wath偵聽器首次加載就執(zhí))watchEffect發(fā)現(xiàn)偵聽器中的代碼對外部有依賴,就會對其進行偵聽,如果依賴的值發(fā)生變化,就會執(zhí)行偵聽器中的代碼,也就是說它不需要傳遞你要偵聽的內(nèi)容,自動會感知代碼依賴,不需要傳遞很多參數(shù),只需要傳遞一個回調(diào)函數(shù)watchEffect只能獲取到當前的值,不能獲取到之前的值
【總結(jié)】
watch和watchEffect都是具備偵聽能力的語法,但是在使用時還是有區(qū)別的。比如:在代碼中要寫ajax請求的時候,一般不會用到之前的數(shù)據(jù),只會用到當前的數(shù)據(jù),結(jié)合當前的數(shù)據(jù)發(fā)送請求,這種情況下使用watchEffect來發(fā)送ajax就比較合適setup是純函數(shù),給固定的輸入就會有固定的輸出,但是涉及到異步請求或者定時器,輸出和輸入就不是純函數(shù),導致它不是純函數(shù)的異步請求叫Effect(副作用),因此從名字上看在處理異步的操作的時候,最好使用watchEffect
其他
取消偵聽器
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(() => {
// 取消偵聽器
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偵聽器也是一樣
讓watch變成非惰性
watch的第三個參數(shù)可以通過{immediate: true}對偵聽器進行配置,這樣wath偵聽器就變成非惰性了
到此這篇關于Vue CompositionAPI中watch和watchEffect的區(qū)別詳解的文章就介紹到這了,更多相關Vue watch watchEffect內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue3+vite中開發(fā)環(huán)境與生產(chǎn)環(huán)境全局變量配置指南
最近在使用vite生成項目,這篇文章主要給大家介紹了關于vue3+vite中開發(fā)環(huán)境與生產(chǎn)環(huán)境全局變量配置的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08
vue+element實現(xiàn)手機號驗證碼注冊的示例
本文主要介紹了vue+element實現(xiàn)手機號驗證碼注冊的示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
vue3中路由傳參query、params及動態(tài)路由傳參詳解
vue3中的傳參方式和vue2中一樣,都可以用query和params傳參,下面這篇文章主要給大家介紹了關于vue3中路由傳參query、params及動態(tài)路由傳參的相關資料,需要的朋友可以參考下2022-09-09

