vue3中的watch使用實(shí)戰(zhàn)案例
前言
前段時(shí)間看了一些直播關(guān)于vue3中的watch的使用,有許多看起來比較難以理解東西,今天就舉幾個(gè)例子看看兄弟們watch的實(shí)際掌握情況
二、案例
tips 以下除開特殊說明,修改的內(nèi)容都是setTimeout里面的賦值操作
1.案例1
<script setup lang="ts">
import { watch, ref } from "vue";
let obj: any = ref({ a: 1, b: { c: 1 } });
watch(
obj,
(newVal, oldVal) => {
console.log(newVal, oldVal);
},
{ deep: true }
);
setTimeout(() => {
obj = { a: 2 }
console.log("修改數(shù)據(jù)");
}, 1000);
</script>
<template></template>
<style scoped>
.read-the-docs {
color: #888;
}
</style>
這一種相信大家可能比較清楚,肯定是不會(huì)觸發(fā)watch的執(zhí)行

2.案例2
修改賦值操作為 obj.value = { a: 2 } 結(jié)果是會(huì)觸發(fā)watch的執(zhí)行

為什么呢:因?yàn)樵谠创a當(dāng)中watch如果第一個(gè)參數(shù)是ref,那么源碼會(huì)將其轉(zhuǎn)換成getter = () => source.value; 即watch判斷的是ref.value有沒有發(fā)生變化,很明顯,這個(gè)案例是發(fā)生了變化,所以watch會(huì)執(zhí)行
3.案例3
修改賦值操作為 obj.value.a = 2 這個(gè)會(huì)不會(huì)呢
可能有的小伙伴看到案例2的解釋覺得不會(huì),但是錯(cuò)誤,因?yàn)檫@里有一個(gè)配置項(xiàng):deep:true,
當(dāng)開啟這個(gè)選項(xiàng)的時(shí)候,就會(huì)遞歸收集,那么相當(dāng)于obj.value的對(duì)象也被監(jiān)聽了,所以會(huì)觸發(fā)

但是當(dāng)你把deep:true改成false或者不做配置就不會(huì)
4.案例4
watch(
() => obj,
(newVal, oldVal) => {
console.log(newVal, oldVal);
}
);
只改變地第一個(gè)參數(shù)的傳遞方式,其他不變,當(dāng)然deep這個(gè)參數(shù)取消了,那么以上的幾種方式會(huì)觸發(fā)執(zhí)行嗎
很遺憾告訴大家,一個(gè)都不會(huì)觸發(fā)

這里就涉及到watch第一個(gè)參數(shù)傳參的方式了:
如果當(dāng)傳的是一個(gè)函數(shù),那么vue不會(huì)對(duì)這個(gè)函數(shù)做處理,監(jiān)聽的也是這個(gè)函數(shù)的返回值,相當(dāng)于你監(jiān)聽的是這個(gè)obj,而不是obj.value,而響應(yīng)式攔截是需要監(jiān)聽數(shù)據(jù),即在這里如果想實(shí)現(xiàn)修改變化,需要監(jiān)聽的是obj.value
但是當(dāng)deep設(shè)置為true時(shí),結(jié)果又不一樣了
除了obj = { a: 2 } 不會(huì)重新觸發(fā),其他都會(huì)觸發(fā),是因?yàn)閐eep:true會(huì)遞歸收集依賴,所以修改都會(huì)變化
5.案例5
watch(
obj.value,
(newVal, oldVal) => {
console.log(newVal, oldVal);
},
);
這里又不一樣了,第一個(gè)參數(shù)是obj.value
那么obj.value.a = 2會(huì)不會(huì)觸發(fā)執(zhí)行呢?
答案是會(huì)!

解釋一下:此時(shí)第一個(gè)參數(shù)obj.value,其實(shí)就相當(dāng)于第一個(gè)參數(shù)是reactive,你修改reactive的屬性的值,肯定是會(huì)觸發(fā)重新執(zhí)行的
6.案例6
修改賦值為obj = { a: 2 } 答案肯定是不會(huì)重新觸發(fā)的,對(duì)象的地址都發(fā)生了變化,不再是原來那個(gè)對(duì)象了,當(dāng)時(shí)你設(shè)置obj.value = {a:2} 是一樣的
7. 案例7
修改obj.b.c = 2 呢,會(huì)重新觸發(fā),因?yàn)閣atch監(jiān)聽reactive默認(rèn)deep:true,默認(rèn)進(jìn)行深度監(jiān)聽

總結(jié)
以上就是關(guān)于watch使用中需要注意的點(diǎn);說實(shí)話,如果沒有看過源碼的話,這些問題很容易對(duì)開發(fā)產(chǎn)生影響,所以大家如果沒事的時(shí)候可以去嘗試閱讀一下源碼
到此這篇關(guān)于vue3中的watch使用的文章就介紹到這了,更多相關(guān)vue3中watch使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue入門之a(chǎn)nimate過渡動(dòng)畫效果
這篇文章主要介紹了Vue入門之a(chǎn)nimate過渡動(dòng)畫效果的相關(guān)資料,需要的朋友可以參考下2018-04-04
Element UI 上傳組件實(shí)現(xiàn)文件上傳并附帶額外參數(shù)功能
在使用 ElementUI 的上傳組件 el-upload 實(shí)現(xiàn)文件上傳功能時(shí),如果單文件上傳是比較簡(jiǎn)單的,但是在實(shí)際需求中,往往會(huì)在上傳文件時(shí)伴隨著一些其他參數(shù),怎么操作呢,下面通過示例代碼講解感興趣的朋友一起看看吧2023-08-08
解決找不到模塊“xxx.vue”或其相應(yīng)的類型聲明問題
這篇文章主要介紹了解決找不到模塊“xxx.vue”或其相應(yīng)的類型聲明問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-10-10
Vue路由跳轉(zhuǎn)傳參或者打開新頁(yè)面跳轉(zhuǎn)問題
這篇文章主要介紹了Vue路由跳轉(zhuǎn)傳參或者打開新頁(yè)面跳轉(zhuǎn)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
vueRouter--matcher之動(dòng)態(tài)增減路由方式
這篇文章主要介紹了vueRouter--matcher之動(dòng)態(tài)增減路由方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
Vue2集成Lodop插件實(shí)現(xiàn)在線打印功能
這篇文章主要為大家詳細(xì)介紹了Vue2如何集成Lodop插件實(shí)現(xiàn)在線打印功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03

