国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue3 —— watch 監(jiān)聽器及源碼學(xué)習(xí)

這篇具有很好參考價值的文章主要介紹了Vue3 —— watch 監(jiān)聽器及源碼學(xué)習(xí)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

  • 該文章是在學(xué)習(xí) 小滿vue3 課程的隨堂記錄
  • 示例均采用 <script setup>,且包含 typescript 的基礎(chǔ)用法

前言

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

一、基本使用

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

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

二、源碼學(xué)習(xí)

由于源碼較多,這里不做截圖文章來源地址http://www.zghlxwxcb.cn/news/detail-653048.html

/**
 * 

 * @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)進(jìn)行了深度監(jiān)聽)
 *    - 數(shù)組類型,做遍歷,對每一項再判斷類型,分別處理完之后丟進(jìn)新數(shù)組返回
 *          - ref類型,返回.value
 *          - reactive類型,遞歸處理后返回
 *          - 函數(shù)的話,進(jìn)行加工
 *    - 函數(shù)類型
 *          - 判斷有沒有 cb
 *              - 有 cb 的話,同樣也是對函數(shù)做了加工賦值給 getter
 *              - 沒有 cb,走進(jìn) watchEffect(下一章)
 *
 * - deep處理:
 *          - cb、deep 若同時存在,即 有回調(diào)函數(shù) 且設(shè)置了 深度監(jiān)聽,進(jìn)行 traverse 遞歸深度監(jiān)聽(當(dāng)然是更耗時的)
 *
 * - flush處理:先初始化出 scheduler 調(diào)度器
 *          - 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 時,會立即調(diào)用一下 job
 *                - 內(nèi)部會先獲取到新值 newVal
 *                - 如果是第一次執(zhí)行,舊值 oldVal 會置為 undefined
 *                - (執(zhí)行完這里才會更新)然后 把新值賦值給舊值,為下一次使用準(zhǔn)備 (所以如果是對象,新舊值是相等的)
 *          - immediate 為 false 時,
 *                - 先給舊值做初始化,如 oldVal = '小滿'
 *                - 依賴如果更新,會觸發(fā) scheduler,執(zhí)行 job
 *                      - job 內(nèi)新值 newVal = '小滿1'
 *                      - 舊值 oldVal 不會走進(jìn) undefined,會等于原有的 oldVal = '小滿'
 *                      - (執(zhí)行完這里才會更新)會把 oldVal = '小滿1'
 *
 *
 */

到了這里,關(guān)于Vue3 —— watch 監(jiān)聽器及源碼學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Vue3:計算屬性、監(jiān)聽器

    Vue3:計算屬性、監(jiān)聽器

    計算屬性是指 基于現(xiàn)有狀態(tài)派生 (演變) 出新的狀態(tài),現(xiàn)有狀態(tài)發(fā)生變化,派生狀態(tài)重新計算。 computed 接收回調(diào)函數(shù)作為參數(shù),基于回調(diào)函數(shù)中使用的響應(yīng)式數(shù)據(jù)進(jìn)行計算屬性的創(chuàng)建,回調(diào)函數(shù)的返回值就是基于現(xiàn)有狀態(tài)演變出的新狀態(tài)。 完整寫法 案例:動態(tài)顯示名字。

    2024年02月09日
    瀏覽(23)
  • 【源碼系列#04】Vue3偵聽器原理(Watch)

    專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項目專欄,硬核??推薦?? 歡迎各位ITer關(guān)注點贊收藏?????? 偵聽一個或多個響應(yīng)式數(shù)據(jù)源,并在數(shù)據(jù)源變化時調(diào)用所給的回調(diào)函數(shù) 第一個參數(shù)可以是不同形式的“數(shù)據(jù)源”:它可以是一個 ref (包括計算屬性

    2024年02月04日
    瀏覽(95)
  • 【Vue2從入門到精通】Vue監(jiān)聽器watch,計算屬性computed,方法methods的區(qū)別及使用場景

    【Vue2從入門到精通】Vue監(jiān)聽器watch,計算屬性computed,方法methods的區(qū)別及使用場景

    ?創(chuàng)作者:全棧弄潮兒 ?? 個人主頁: 全棧弄潮兒的個人主頁 ??? 個人社區(qū),歡迎你的加入:全棧弄潮兒的個人社區(qū) ?? 專欄地址:vue2從入門到精通 【分享幾個國內(nèi)免費可用的ChatGPT鏡像】 【10幾個類ChatGPT國內(nèi)AI大模型】 【用《文心一言》1分鐘寫一篇博客簡直yyds】 【用

    2023年04月15日
    瀏覽(37)
  • watch監(jiān)聽器三種監(jiān)聽方式

    1、普通監(jiān)聽( 無法監(jiān)聽到第一次綁定的變化 ) 這樣使用watch時有一個特點,就是當(dāng)值第一次綁定的時候,不會執(zhí)行監(jiān)聽函數(shù),只有值發(fā)生改變才會執(zhí)行。 2、普通監(jiān)聽( 可以監(jiān)聽到第一次綁定的變化) 給 text 綁定了一個handler方法,之前我們寫的 watch 方法其實默認(rèn)寫的就是

    2024年02月15日
    瀏覽(23)
  • Vue3前端開發(fā),watch數(shù)據(jù)偵聽器的立即執(zhí)行

    Vue3前端開發(fā),watch數(shù)據(jù)偵聽器的立即執(zhí)行

    Vue3前端開發(fā),watch數(shù)據(jù)偵聽器的立即執(zhí)行!實際上,我們可以通過回調(diào)函數(shù)的后面,再追加一個對象,來設(shè)置這個參數(shù),immediate:true.來實現(xiàn)一種立即執(zhí)行的效果。在頁面記載完成后,馬上就會執(zhí)行一次watch. 如上所示,我們在回調(diào)函數(shù)的后面,追加了一個參數(shù),是一個對象類型

    2024年01月18日
    瀏覽(29)
  • vue3 watch 監(jiān)聽多值以及深度監(jiān)聽用法

    1.監(jiān)聽單個值 引入: import {…, watch} from “vue”; import {useRouter} from ‘vue-router’; 2.監(jiān)聽多個值 還是上面路由的例子 2.深度監(jiān)聽

    2024年02月14日
    瀏覽(23)
  • Vue3 計算屬性和偵聽器實戰(zhàn)(computed、watch)——簡易點餐頁面

    Vue3 計算屬性和偵聽器實戰(zhàn)(computed、watch)——簡易點餐頁面

    這篇文章記錄一下 Vue3 計算屬性和偵聽器 (computed、watch) 實戰(zhàn)的內(nèi)容,這篇文章我們在有計算屬性和偵聽器的基礎(chǔ)上,我們來制作一個簡易點餐頁面,接下來我們一起來從零到一開始制作。 計算屬性和偵聽器相關(guān)文章推薦: 深入與淺談 Vue 中計算屬性和偵聽器的區(qū)別和使用

    2024年02月09日
    瀏覽(34)
  • 微信小程序 - 最新超詳細(xì) watch 偵聽器功能,支持監(jiān)聽對象、數(shù)組及各種復(fù)雜對象數(shù)據(jù),可在任意頁面或組件中使用(絕非網(wǎng)上千篇一律的 “setWatcher“ 不能監(jiān)聽對象的垃圾方法,方案開箱即用)

    網(wǎng)上的教程全都是一摸一樣的 setWatcher(this) 方案,重要的是這種方案不能監(jiān)聽對象,可以說一無是處。 本文 在微信小程序中實現(xiàn) watch 監(jiān)聽器監(jiān)聽數(shù)據(jù)的功能,讓小程序擁有 watch 監(jiān)聽對象、數(shù)組等復(fù)雜數(shù)據(jù)變化的能力, 您按照教程幾分鐘就能搞定,保證 100% 好用且使用方法

    2024年02月11日
    瀏覽(90)
  • Vue3 watch 監(jiān)聽對象數(shù)組中對象的特定屬性

    在 Vue 3 中,可以使用 watch 函數(shù)來監(jiān)聽對象數(shù)組中對象的特定屬性??梢酝ㄟ^在回調(diào)函數(shù)中遍歷數(shù)組來檢查對象的特定屬性是否發(fā)生變化,并在變化發(fā)生時執(zhí)行相應(yīng)的操作。 例如,假設(shè)有一個名為 items 的對象數(shù)組,其中每個對象都有一個名為 checked 的布爾屬性和一個名為 n

    2023年04月20日
    瀏覽(22)
  • vue3中用watch監(jiān)聽響應(yīng)式數(shù)據(jù)的注意點

    vue3中用watch監(jiān)聽響應(yīng)式數(shù)據(jù)的注意點

    如果你在vue3中使用reactive()方法創(chuàng)建響應(yīng)式數(shù)據(jù),然后又用torefs()方法將響應(yīng)式數(shù)據(jù)解構(gòu)成單一的ref響應(yīng)式數(shù)據(jù)。 此時,如果你想用watch監(jiān)聽解構(gòu)出來單一的響應(yīng)式數(shù)據(jù),watch不起作用。 此時,你需要用watch監(jiān)聽之前的reactive()方法創(chuàng)建的數(shù)據(jù),這樣是能監(jiān)聽到的,要開啟深度監(jiān)

    2024年02月13日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包