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

Vue3中watch監(jiān)聽器及源碼學習

 更新時間:2024年01月21日 11:40:24   作者:Unique·Blue  
本文主要介紹了Vue3中watch監(jiān)聽器及源碼學習,Watch偵聽器在Vue3中特性進行了一些改變和優(yōu)化,下面來詳解的介紹一下基本使用,具有一定的參考價值,感興趣的可以了解一下

示例均采用 <script setup>,且包含 typescript 的基礎用法

前言

在 vue3 中,必須是 ref、reactive 包裹起來的數(shù)據(jù),才可以被 watch 監(jiān)聽到

一、基本使用

1、語法:watch(source, cb, options)

  • source 是監(jiān)聽的目標,有 4 種書寫形式:
    • reactive 形式的響應式數(shù)據(jù)
    • ref 形式的響應式數(shù)據(jù)
    • 數(shù)組形式:監(jiān)聽多個響應式數(shù)據(jù)時(應該用的不多)
      • 挨個放進 數(shù)組 里,如 [響應式數(shù)據(jù)1, 響應式數(shù)據(jù)2]
      • cb 對應的 函數(shù)參數(shù)(新值、舊值)也都是 數(shù)組 形式,詳見例子
    • 函數(shù)形式:若只想監(jiān)聽 reactive 深層中 的 指定屬性,該指定屬性是
      • 引用類型,不需要函數(shù)形式,直接 obj.a.b
      • 非引用類型,比如是一個字符串,則需要使用 函數(shù)形式 返回,詳見例子
  • cb 是回調函數(shù),(newVal,oldVal) => {}
  • options 是配置項
    • deep: 是否開啟深層監(jiān)聽
      • reactive 類型的數(shù)據(jù) 不需要開啟,源碼中已做了深層響應式
      • ref 類型的數(shù)據(jù)如果需要監(jiān)聽到深層,要設置為 true(雖然監(jiān)聽到深層,但是 source 不能指定到深層)
    • immediate: 是否立刻執(zhí)行
    • flush: watch 的執(zhí)行順序。
      • pre 組件更新之前執(zhí)行(默認)
      • sync 同步執(zhí)行;
      • post 組件更新之后執(zhí)行

2、例子

下面代碼中,演示了多個情景下的使用

<input type="text" v-model="xiaoman1" />
<br />
<input type="text" v-model="xiaoman2" />
<br />
<input type="text" v-model="message.foo.bar" />
<br />
<input type="text" v-model="message2.foo.bar" />
const xiaoman1 = ref<string>("小滿1");
const xiaoman2 = ref<string>("小滿2");

const message = ref({
  foo: {
    bar: "aaaaa",
  },
});

const message2 = reactive({
  foo: {
    bar: "aaaaa",
  },
});

watch(xiaoman1, (newVal, oldVal) => {
  console.log("監(jiān)聽單個數(shù)據(jù)源", newVal, oldVal);
});

// 用數(shù)組監(jiān)聽多個數(shù)據(jù)源,[新值數(shù)組], [舊值數(shù)組]
watch([xiaoman1, xiaoman2], (newVal, oldVal) => {
  console.log("用數(shù)組監(jiān)聽多個數(shù)據(jù)源,[新值數(shù)組], [舊值數(shù)組]", newVal, oldVal);
});

// ref 深層監(jiān)聽
watch(
  message,
  (newVal, oldVal) => {
    // 如果是引用類型,新值 和 舊值 是一樣的
    console.log("ref 深層監(jiān)聽&立刻執(zhí)行", newVal, oldVal);
  },
  {
    deep: true, // 深度監(jiān)聽,ref 若需要深度監(jiān)聽,這里要開啟
    immediate: true, // callback 立刻先執(zhí)行一次
    flush: "pre", // 【watch的執(zhí)行順序】 pre 組件更新之前調用(默認);sync 同步執(zhí)行;post 組件更新之后執(zhí)行
    // flush 屬性在 watch 中用的不多,watchEffect中可能用到
  }
);

// reactive 深層監(jiān)聽:不必開啟深度監(jiān)聽
watch(
  message2,
  (newVal, oldVal) => {
    // 如果是引用類型,新值 和 舊值 是一樣的
    console.log("reactive 深層監(jiān)聽&立刻執(zhí)行", newVal, oldVal);
  },
  {
    // deep: true, // reactive 不必開啟深度監(jiān)聽,源碼已做了深層監(jiān)聽
    // immediate: true,
  }
);

// 若只想監(jiān)聽 reactive 深層中的單個屬性,(第一個參數(shù))引用類型可直接寫,否則使用函數(shù)形式
watch(
  message2.foo, // 監(jiān)聽到 foo,foo是引用類型,直接寫就行
  // () => message2.foo.bar, // 監(jiān)聽到 bar,需要用函數(shù)形式

  (newVal, oldVal) => {
    // 如果是引用類型,新值 和 舊值 是一樣的
    console.log("reactive 監(jiān)聽深層中的單個屬性", newVal, oldVal);
  }
);

二、源碼學習

由于源碼較多,這里不做截圖

/**
 * 

 * @vue/runtime-core/runtime-core.cjs.prod.js 搜索 function watch
 *
 * -  watch(source, cb, options)
 *
 * -  source 有很多種類型,reactive、ref、數(shù)組、函數(shù),所以先判斷類型,格式化source
 *    - ref 類型,直接把 value 取出來,賦值給 getter
 *    - reactive 類型,直接把整體賦值給 getter,deep 手動置為 true 即可(reactive已經(jīng)進行了深度監(jiān)聽)
 *    - 數(shù)組類型,做遍歷,對每一項再判斷類型,分別處理完之后丟進新數(shù)組返回
 *          - ref類型,返回.value
 *          - reactive類型,遞歸處理后返回
 *          - 函數(shù)的話,進行加工
 *    - 函數(shù)類型
 *          - 判斷有沒有 cb
 *              - 有 cb 的話,同樣也是對函數(shù)做了加工賦值給 getter
 *              - 沒有 cb,走進 watchEffect(下一章)
 *
 * - deep處理:
 *          - cb、deep 若同時存在,即 有回調函數(shù) 且設置了 深度監(jiān)聽,進行 traverse 遞歸深度監(jiān)聽(當然是更耗時的)
 *
 * - flush處理:先初始化出 scheduler 調度器
 *          - sync 同步執(zhí)行,scheduler = job
 *          - post 組件更新后,將 job 通過 queuePostRenderEffect 函數(shù)處理后再賦值給 scheduler
 *                  - 注意,源碼中看到 queuePostRenderEffect 這個函數(shù),一定表示是在組件更新之后再去執(zhí)行
 *          - pre 組件更新前,queueJob 處理 job 后賦值給 scheduler
 *
 * - ReactiveEffect 收集依賴更新:
 *          - 上面步驟 將 getter、scheduler處理好后作為參數(shù) 給到 ReactiveEffect 函數(shù)
 *          - ReactiveEffect 收集好依賴之后,有更新的話 就會觸發(fā) scheduler,也就是說會執(zhí)行 job
 *
 *
 * - cb 存在
 *          - immediate 為 true 時,會立即調用一下 job
 *                - 內部會先獲取到新值 newVal
 *                - 如果是第一次執(zhí)行,舊值 oldVal 會置為 undefined
 *                - (執(zhí)行完這里才會更新)然后 把新值賦值給舊值,為下一次使用準備 (所以如果是對象,新舊值是相等的)
 *          - immediate 為 false 時,
 *                - 先給舊值做初始化,如 oldVal = '小滿'
 *                - 依賴如果更新,會觸發(fā) scheduler,執(zhí)行 job
 *                      - job 內新值 newVal = '小滿1'
 *                      - 舊值 oldVal 不會走進 undefined,會等于原有的 oldVal = '小滿'
 *                      - (執(zhí)行完這里才會更新)會把 oldVal = '小滿1'
 *
 *
 */

到此這篇關于Vue3中watch監(jiān)聽器及源碼學習的文章就介紹到這了,更多相關Vue3中watch監(jiān)聽器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • 如何理解Vue的.sync修飾符的使用

    如何理解Vue的.sync修飾符的使用

    本篇文章主要介紹了如何理解Vue的.sync修飾符的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Vue專屬狀態(tài)管理庫Pinia的使用與實踐分享

    Vue專屬狀態(tài)管理庫Pinia的使用與實踐分享

    在 Vue 的開發(fā)中,狀態(tài)管理是一個不可或缺的部分,尤其是在復雜的應用中,組件之間的狀態(tài)共享和管理變得至關重要,Pinia 作為 Vue 的專屬狀態(tài)管理庫,本文將深入介紹 Pinia 的基礎知識、核心功能以及實際使用場景,需要的朋友可以參考下
    2024-11-11
  • 解決vue 格式化銀行卡(信用卡)每4位一個符號隔斷的問題

    解決vue 格式化銀行卡(信用卡)每4位一個符號隔斷的問題

    這篇文章主要介紹了vue 格式化銀行卡(信用卡)每4位一個符號隔斷的問題,本文給大家分享了解決方法,需要的朋友可以參考下
    2018-09-09
  • 分分鐘玩轉Vue.js組件(二)

    分分鐘玩轉Vue.js組件(二)

    這篇文章教大家如何分分鐘玩轉Vue.js組件,完善了vue.js組件的學習資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Vue中的v-model綁定修飾符的實現(xiàn)原理

    Vue中的v-model綁定修飾符的實現(xiàn)原理

    v-model 是Vue.js中的一個重要指令,通過它我們可以輕松實現(xiàn)數(shù)據(jù)的雙向綁定,本文介紹一些常用的 v-model 綁定修飾符,并解析它們的實現(xiàn)原理,感興趣的朋友一起看看吧
    2024-01-01
  • vue3的動態(tài)組件是如何工作的

    vue3的動態(tài)組件是如何工作的

    這篇文章主要介紹了vue3的動態(tài)組件是如何工作的,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下
    2021-03-03
  • vite打包只生成了一個css和js文件問題的解決方法

    vite打包只生成了一個css和js文件問題的解決方法

    今天整了一個項目,試了下打包,發(fā)下打包后只生成了一個css文件,和一個js文件,這樣肯定是不行的,因為這樣這個文件的包大小很大,第一次訪問會導致白屏問題,所以本文給大家介紹了vite打包只生成了一個css和js文件問題的解決方法,需要的朋友可以參考下
    2024-05-05
  • Vue+Element-UI中el-table動態(tài)合并單元格:span-method方法代碼詳解

    Vue+Element-UI中el-table動態(tài)合并單元格:span-method方法代碼詳解

    el-table是element-ui提供的表格組件,可以用于展示和操作數(shù)據(jù),這篇文章主要給大家介紹了關于Vue+Element-UI中el-table動態(tài)合并單元格:span-method方法的相關資料,需要的朋友可以參考下
    2023-09-09
  • 詳解vue中父子參數(shù)傳遞雙向的方式不同

    詳解vue中父子參數(shù)傳遞雙向的方式不同

    本文主要介紹了詳解vue中父子參數(shù)傳遞雙向的方式不同,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-06-06
  • vue 兄弟組件的信息傳遞的方法實例詳解

    vue 兄弟組件的信息傳遞的方法實例詳解

    這篇文章主要介紹了vue 兄弟組件的信息傳遞的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08

最新評論

北海市| 潼南县| 海盐县| 绥江县| 克什克腾旗| 怀柔区| 来凤县| 广东省| 当雄县| 尉犁县| 当雄县| 隆回县| 无为县| 古浪县| 靖边县| 清新县| 通辽市| 道孚县| 斗六市| 南阳市| 和平县| 文化| 丰都县| 邮箱| 松江区| 隆回县| 宾阳县| 平乐县| 汝南县| 新田县| 兴国县| 枞阳县| 石家庄市| 镇平县| 繁昌县| 汝南县| 德庆县| 珠海市| 顺义区| 怀仁县| 宁陵县|