最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3中的watch使用實(shí)戰(zhàn)案例

 更新時(shí)間:2025年10月21日 09:40:43   作者:歐陽(yáng)天風(fēng)  
Vue3的watch功能是Vue生態(tài)系統(tǒng)中一個(gè)強(qiáng)大的工具,可以幫助開(kāi)發(fā)者監(jiān)視數(shù)據(jù)的變化并執(zhí)行相應(yīng)的操作,這篇文章主要介紹了vue3中watch使用的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

前段時(shí)間看了一些直播關(guān)于vue3中的watch的使用,有許多看起來(lái)比較難以理解東西,今天就舉幾個(gè)例子看看兄弟們watch的實(shí)際掌握情況

二、案例

tips 以下除開(kāi)特殊說(shuō)明,修改的內(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有沒(méi)有發(fā)生變化,很明顯,這個(gè)案例是發(fā)生了變化,所以watch會(huì)執(zhí)行

3.案例3

修改賦值操作為 obj.value.a = 2 這個(gè)會(huì)不會(huì)呢

可能有的小伙伴看到案例2的解釋覺(jué)得不會(huì),但是錯(cuò)誤,因?yàn)檫@里有一個(gè)配置項(xiàng):deep:true

當(dāng)開(kāi)啟這個(gè)選項(xiàng)的時(shí)候,就會(huì)遞歸收集,那么相當(dāng)于obj.value的對(duì)象也被監(jiān)聽(tīng)了,所以會(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)聽(tīng)的也是這個(gè)函數(shù)的返回值,相當(dāng)于你監(jiān)聽(tīng)的是這個(gè)obj,而不是obj.value,而響應(yīng)式攔截是需要監(jiān)聽(tīng)數(shù)據(jù),即在這里如果想實(shí)現(xiàn)修改變化,需要監(jiān)聽(tīng)的是obj.value

但是當(dāng)deep設(shè)置為true時(shí),結(jié)果又不一樣了

除了obj = { a: 2 } 不會(huì)重新觸發(fā),其他都會(huì)觸發(fā),是因?yàn)閐eep:true會(huì)遞歸收集依賴(lài),所以修改都會(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ā)生了變化,不再是原來(lái)那個(gè)對(duì)象了,當(dāng)時(shí)你設(shè)置obj.value = {a:2} 是一樣的

7. 案例7

修改obj.b.c = 2 呢,會(huì)重新觸發(fā),因?yàn)閣atch監(jiān)聽(tīng)reactive默認(rèn)deep:true,默認(rèn)進(jìn)行深度監(jiān)聽(tīng)

總結(jié)

以上就是關(guān)于watch使用中需要注意的點(diǎn);說(shuō)實(shí)話,如果沒(méi)有看過(guò)源碼的話,這些問(wèn)題很容易對(duì)開(kāi)發(fā)產(chǎn)生影響,所以大家如果沒(méi)事的時(shí)候可以去嘗試閱讀一下源碼

到此這篇關(guān)于vue3中的watch使用的文章就介紹到這了,更多相關(guān)vue3中watch使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue項(xiàng)目完成后如何實(shí)現(xiàn)項(xiàng)目?jī)?yōu)化的示例

    vue項(xiàng)目完成后如何實(shí)現(xiàn)項(xiàng)目?jī)?yōu)化的示例

    本文主要介紹了vue項(xiàng)目完成后如何實(shí)現(xiàn)項(xiàng)目?jī)?yōu)化的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • vue3中的this.$set寫(xiě)法舉例

    vue3中的this.$set寫(xiě)法舉例

    在Vue2中,由于數(shù)據(jù)響應(yīng)式是利用object.definedProperty()實(shí)現(xiàn)的,無(wú)法深層監(jiān)聽(tīng)數(shù)據(jù)變化,因此提供了$set方法來(lái)解決數(shù)據(jù)變化視圖未實(shí)時(shí)更新的問(wèn)題,然而,在Vue3中,數(shù)據(jù)響應(yīng)式使用ES6的proxy進(jìn)行數(shù)據(jù)代理,因此廢棄了$set的概念
    2024-10-10
  • 關(guān)于vue-resource報(bào)錯(cuò)450的解決方案

    關(guān)于vue-resource報(bào)錯(cuò)450的解決方案

    本篇文章主要介紹關(guān)于vue-resource報(bào)錯(cuò)450的解決方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 利用Vue3和element-plus實(shí)現(xiàn)圖片上傳組件

    利用Vue3和element-plus實(shí)現(xiàn)圖片上傳組件

    element-plus提供了uploader組件,但是不好定制化。所以本文將利用Vue3和element-plus實(shí)現(xiàn)一個(gè)圖片上傳的組件,感興趣的可以了解一下
    2022-03-03
  • vue3集成echarts數(shù)據(jù)刷新后圖表不刷新的解決方法

    vue3集成echarts數(shù)據(jù)刷新后圖表不刷新的解決方法

    vue3 集成 echarts 最大的坑就是出現(xiàn)了,reactive 的數(shù)據(jù) 刷新了,但圖表缺不會(huì)刷新,所以本文就給大家詳細(xì)的介紹一下vue3集成echarts數(shù)據(jù)刷新后圖表不刷新的解決方法,需要的朋友可以參考下
    2023-08-08
  • vue3+el-select實(shí)現(xiàn)觸底加載更多功能(ts版)

    vue3+el-select實(shí)現(xiàn)觸底加載更多功能(ts版)

    這篇文章主要給大家介紹了基于vue3和el-select實(shí)現(xiàn)觸底加載更多功能,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以借鑒參考下
    2023-07-07
  • Vue3項(xiàng)目中父子組件之間互相傳值、傳遞方法詳細(xì)介紹

    Vue3項(xiàng)目中父子組件之間互相傳值、傳遞方法詳細(xì)介紹

    組件傳值問(wèn)題是Vue開(kāi)發(fā)中非常重要的一個(gè)話題,涉及到父子組件和非父子組件之間的傳值問(wèn)題,這篇文章主要介紹了Vue3項(xiàng)目中父子組件之間互相傳值、傳遞方法的相關(guān)資料,需要的朋友可以參考下
    2025-05-05
  • Vue?列表過(guò)濾與排序的實(shí)現(xiàn)

    Vue?列表過(guò)濾與排序的實(shí)現(xiàn)

    這篇文章主要介紹了Vue?列表過(guò)濾與排序的實(shí)現(xiàn),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值需要的小伙伴可以參考一下
    2022-05-05
  • vue項(xiàng)目打包時(shí)自動(dòng)更新版本號(hào)的實(shí)現(xiàn)方法

    vue項(xiàng)目打包時(shí)自動(dòng)更新版本號(hào)的實(shí)現(xiàn)方法

    本文主要介紹了vue項(xiàng)目打包時(shí)自動(dòng)更新版本號(hào)的實(shí)現(xiàn)方法,通過(guò)在根目錄下創(chuàng)建autoVersion.js腳本文件,頁(yè)面獲取版本號(hào)時(shí)直接使用,修改package.json配置,感興趣的可以了解一下
    2025-02-02
  • vue3-print-nb實(shí)現(xiàn)頁(yè)面打印(含分頁(yè)打印)示例代碼

    vue3-print-nb實(shí)現(xiàn)頁(yè)面打印(含分頁(yè)打印)示例代碼

    大多數(shù)后臺(tái)系統(tǒng)中都存在打印的需求,在有打印需求時(shí),對(duì)前端來(lái)說(shuō)當(dāng)然是直接打印頁(yè)面更容易,下面這篇文章主要給大家介紹了關(guān)于vue3-print-nb實(shí)現(xiàn)頁(yè)面打印(含分頁(yè)打印)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

新余市| 定西市| 通许县| 连城县| 商城县| 丘北县| 普安县| 广河县| 新乐市| 巫溪县| 新源县| 汶川县| 霍山县| 通渭县| 金溪县| 葵青区| 巴青县| 简阳市| 黎城县| 南丰县| 三台县| 马鞍山市| 常山县| 灵台县| 吉木萨尔县| 友谊县| 隆林| 昆明市| 西贡区| 大埔区| 定结县| 措勤县| 汾阳市| 南平市| 永春县| 依兰县| 东安县| 安徽省| 博湖县| 昌吉市| 应城市|