欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3?中?watch?與?watchEffect?區(qū)別及用法小結(jié)

 更新時(shí)間:2022年06月09日 09:40:13   作者:WEB前端開(kāi)發(fā)社區(qū)  
這篇文章主要介紹了Vue3?中?watch?與?watchEffect?有什么區(qū)別?watch中需要指明監(jiān)視的屬性,也需要指明監(jiān)視的回調(diào),而watchEffect中不需要指明監(jiān)視的屬性,只需要指明監(jiān)視的回調(diào),回調(diào)函數(shù)中用到哪個(gè)屬性,就監(jiān)視哪個(gè)屬性,本文給大家詳細(xì)介紹,需要的朋友參考下

大部分時(shí)候用 watch 顯式的指定依賴以避免不必要的重復(fù)觸發(fā),也避免在后續(xù)代碼修改或重構(gòu)時(shí)不小心引入新的依賴。watchEffect 適用于一些邏輯相對(duì)簡(jiǎn)單,依賴源和邏輯強(qiáng)相關(guān)的場(chǎng)景。

你可以認(rèn)為他們是同一個(gè)功能的兩種不同形態(tài),底層的實(shí)現(xiàn)是一樣的。

  • watch- 顯式指定依賴源,依賴源更新時(shí)執(zhí)行回調(diào)函數(shù)
  • watchEffect - 自動(dòng)收集依賴源,依賴源更新時(shí)重新執(zhí)行自身

響應(yīng)式依賴收集

首先先需要了解一下 vue 3 的響應(yīng)式是怎么工作的。我想很多文章都詳細(xì)的講過(guò)這個(gè)部分了,這里就簡(jiǎn)單帶過(guò)一下。這里有個(gè)簡(jiǎn)化版的 ref 的實(shí)現(xiàn):

const ref = (initialValue) => {  let _value = initialValue  return {    get value() {
     track(this, 'value') // 收集依賴
     return _value
   },    set value() {
     _value = value
     trigger(this, 'value') // 觸發(fā)依賴
   }
 }
}

訪問(wèn)數(shù)據(jù)時(shí),track 被呼叫并記錄下訪問(wèn)了的字段。而當(dāng)寫入數(shù)據(jù)時(shí),trigger 被呼叫并觸發(fā)之前所依賴了這個(gè)字段所綁定事件更新(即 effect - computed, watch, watchEffect 底層都是 effect),他們會(huì)被記錄在一個(gè)全局的 WeakMap 中,這里就不展開(kāi)了,感興趣可以去看源碼。

const counter = ref(1)
console.log(counter.value) // `track()` 被呼叫
counter.value = 2 // `trigger()` 被呼叫

當(dāng)我們需要函數(shù)里的依賴時(shí),只需要記錄函數(shù)執(zhí)行的過(guò)程中 track()被呼叫的次數(shù)(和對(duì)應(yīng)的對(duì)象與字段)即可。例如:

const counter = ref(1)function foo() {  console.log(counter.value)
}function collectDeps() {
 startTracking()
 foo() // 在這個(gè)過(guò)程中,counter 被收集
 stopTracking()
}

這樣便可以知道 foo 這個(gè)函數(shù)依賴了 counter。

Watch

一個(gè) generalised 的 watch api 應(yīng)該是這樣的(其他類似直接接受 ref 或者 reactive 作為參數(shù)的其實(shí)都是糖)。

watch(
 () => { /* 依賴源收集函數(shù) */ },
 () => { /* 依賴源改變時(shí)的回調(diào)函數(shù) */ }
)

這里的依賴源函數(shù)只會(huì)執(zhí)行一次,回調(diào)函數(shù)會(huì)在每次依賴源改變的時(shí)候觸發(fā),但是并不對(duì)回調(diào)函數(shù)進(jìn)行依賴收集。也就是說(shuō),依賴源和回調(diào)函數(shù)之間并不一定要有直接關(guān)系。

WatchEffect

watchEffect 相當(dāng)于將 watch 的依賴源和回調(diào)函數(shù)合并,當(dāng)任何你有用到的響應(yīng)式依賴更新時(shí),該回調(diào)函數(shù)便會(huì)重新執(zhí)行。

不同于 watch,watchEffect 的回調(diào)函數(shù)會(huì)被立即執(zhí)行(即 { immediate: true })。

watchEffect(
 () => { /* 依賴源同時(shí)是回調(diào)函數(shù) */ }
)

以下兩種用法在行為上基本等價(jià):

watchEffect(  () => console.log(counter.value)
)
watch(  () => counter.value,  () => console.log(counter.value),
 { immediate: true }
)

與 watch 不同的一點(diǎn)是,在 watchEffect 中依賴源會(huì)被重復(fù)執(zhí)行,動(dòng)態(tài)新增加的依賴也會(huì)被收集,例如:

const counter = ref(0)const enabled = ref(false)
watchEffect(() => {  if (enabled.value)
   console.log(counter.value)
})// (以下忽略 nextTick)// watchEffect 會(huì)被立即執(zhí)行,因?yàn)?“enabled“ 為 false, 此時(shí)僅收集到 “enabled“ 依賴counter.value += 1 // 無(wú)反應(yīng)enabled.value = true // Effect 觸發(fā),控制臺(tái)出 "1"counter.value += 1 // “counter“ 被作為新的依賴被收集,控制臺(tái)出 "2"enabled.value = false // 函數(shù)被重新執(zhí)行,無(wú)輸出counter.value += 1 // 函數(shù)被重新執(zhí)行,無(wú)輸出 (雖然 counter 已經(jīng)沒(méi)有用了,但是作為依賴還是會(huì)觸發(fā)函數(shù))

順帶一提,computed 其實(shí)類似一個(gè)帶輸出的同步版本的 watchEffect。

什么時(shí)候用什么?

推薦在大部分時(shí)候用 watch 顯式的指定依賴以避免不必要的重復(fù)觸發(fā),也避免在后續(xù)代碼修改或重構(gòu)時(shí)不小心引入新的依賴。watchEffect 適用于一些邏輯相對(duì)簡(jiǎn)單,依賴源和邏輯強(qiáng)相關(guān)的場(chǎng)景(或者懶惰的場(chǎng)景 )。

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

相關(guān)文章

  • Vue-cli打包后如何本地查看的操作

    Vue-cli打包后如何本地查看的操作

    這篇文章主要介紹了Vue-cli打包后如何本地查看的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Vue3實(shí)現(xiàn)Message消息組件示例

    Vue3實(shí)現(xiàn)Message消息組件示例

    在大多數(shù) web 產(chǎn)品中,全局的 Message 組件占有較大的使用場(chǎng)景,本文主要介紹了Vue3實(shí)現(xiàn)Message消息組件示例,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • ElementPlus表單rules校驗(yàn)的方法步驟

    ElementPlus表單rules校驗(yàn)的方法步驟

    相信大家經(jīng)常都會(huì)遇到要處理表單驗(yàn)證的環(huán)節(jié),而我在最近的項(xiàng)目中也遇到需要做表單驗(yàn)證的業(yè)務(wù),下面這篇文章主要給大家介紹了關(guān)于ElementPlus表單rules校驗(yàn)的方法步驟,需要的朋友可以參考下
    2023-04-04
  • Vue腳手架的安裝全過(guò)程

    Vue腳手架的安裝全過(guò)程

    文章介紹了Node.js下載與配置步驟:選擇LTS版本、創(chuàng)建node_global和node_cache文件夾、設(shè)置權(quán)限、配置淘寶鏡像,以及Vue腳手架安裝和使用方法,包括創(chuàng)建項(xiàng)目、運(yùn)行代碼和測(cè)試安裝成功
    2025-08-08
  • vue項(xiàng)目在線上服務(wù)器訪問(wèn)失敗原因分析

    vue項(xiàng)目在線上服務(wù)器訪問(wèn)失敗原因分析

    這篇文章主要介紹了vue項(xiàng)目在線上服務(wù)器訪問(wèn)失敗原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • 解決element-ui?el-drawer抽屜el-dialog彈框關(guān)閉優(yōu)化demo

    解決element-ui?el-drawer抽屜el-dialog彈框關(guān)閉優(yōu)化demo

    這篇文章主要為大家介紹了解決element-ui?el-drawer抽屜el-dialog彈框關(guān)閉優(yōu)化demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-06-06
  • 使用@tap.stop阻止事件繼續(xù)傳播

    使用@tap.stop阻止事件繼續(xù)傳播

    這篇文章主要介紹了使用@tap.stop阻止事件繼續(xù)傳播,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Electron 如何調(diào)用本地模塊的方法

    Electron 如何調(diào)用本地模塊的方法

    這篇文章主要介紹了Electron 如何調(diào)用本地模塊的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • vue+mockjs模擬數(shù)據(jù)實(shí)現(xiàn)前后端分離開(kāi)發(fā)的實(shí)例代碼

    vue+mockjs模擬數(shù)據(jù)實(shí)現(xiàn)前后端分離開(kāi)發(fā)的實(shí)例代碼

    本篇文章主要介紹了vue+mockjs模擬數(shù)據(jù)實(shí)現(xiàn)前后端分離開(kāi)發(fā)的實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • Vue獲取HTMLCollection列表的children時(shí)結(jié)果為undefined問(wèn)題

    Vue獲取HTMLCollection列表的children時(shí)結(jié)果為undefined問(wèn)題

    這篇文章主要介紹了Vue獲取HTMLCollection列表的children時(shí)結(jié)果為undefined問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評(píng)論