成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Vue3 中 watch 與 watchEffect 有什么區別?

開發 前端
大部分時候用 watch 顯式的指定依賴以避免不必要的重復觸發,也避免在后續代碼修改或重構時不小心引入新的依賴。watchEffect 適用于一些邏輯相對簡單,依賴源和邏輯強相關的場景。

你可以認為他們是同一個功能的兩種不同形態,底層的實現是一樣的。

  • watch- 顯式指定依賴源,依賴源更新時執行回調函數
  • watchEffect - 自動收集依賴源,依賴源更新時重新執行自身

響應式依賴收集

首先先需要了解一下 vue 3 的響應式是怎么工作的。我想很多文章都詳細的講過這個部分了,這里就簡單帶過一下。這里有個簡化版的 ref 的實現:

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

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

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

當我們需要函數里的依賴時,只需要記錄函數執行的過程中 track()被呼叫的次數(和對應的對象與字段)即可。例如:

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

這樣便可以知道 foo 這個函數依賴了 counter。

Watch

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

watch(
() => { /* 依賴源收集函數 */ },
() => { /* 依賴源改變時的回調函數 */ }
)

這里的依賴源函數只會執行一次,回調函數會在每次依賴源改變的時候觸發,但是并不對回調函數進行依賴收集。也就是說,依賴源和回調函數之間并不一定要有直接關系。

WatchEffect

watchEffect 相當于將 watch 的依賴源和回調函數合并,當任何你有用到的響應式依賴更新時,該回調函數便會重新執行。

不同于 watch,watchEffect 的回調函數會被立即執行(即 { immediate: true })。

watchEffect(
() => { /* 依賴源同時是回調函數 */ }
)

以下兩種用法在行為上基本等價:

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

與 watch 不同的一點是,在 watchEffect 中依賴源會被重復執行,動態新增加的依賴也會被收集,例如:

const counter = ref(0)const enabled = ref(false)
watchEffect(() => { if (enabled.value)
console.log(counter.value)
})// (以下忽略 nextTick)// watchEffect 會被立即執行,因為 “enabled“ 為 false, 此時僅收集到 “enabled“ 依賴counter.value += 1 // 無反應enabled.value = true // Effect 觸發,控制臺出 "1"counter.value += 1 // “counter“ 被作為新的依賴被收集,控制臺出 "2"enabled.value = false // 函數被重新執行,無輸出counter.value += 1 // 函數被重新執行,無輸出 (雖然 counter 已經沒有用了,但是作為依賴還是會觸發函數)

順帶一提,computed 其實類似一個帶輸出的同步版本的 watchEffect。

什么時候用什么?

推薦在大部分時候用 watch 顯式的指定依賴以避免不必要的重復觸發,也避免在后續代碼修改或重構時不小心引入新的依賴。watchEffect 適用于一些邏輯相對簡單,依賴源和邏輯強相關的場景(或者懶惰的場景 )。

責任編輯:龐桂玉 來源: WEB前端開發社區
相關推薦

2022-07-14 08:22:48

Computedvue3

2021-12-07 05:44:45

Vue 3 Watch WatchEffect

2020-12-22 13:46:48

APISKD

2011-08-08 14:09:55

dhcpbootp

2018-07-13 17:05:22

SQLMySQL數據庫

2023-10-13 15:48:17

OT系統

2023-12-25 15:40:55

React開發

2020-09-06 09:51:57

SNMP TrapSyslog網絡協議

2019-02-27 15:22:15

混合云云計算多云

2021-05-16 15:28:59

沙箱容器惡意軟件

2022-08-31 08:33:54

Bash操作系統Linux

2022-05-18 14:18:56

區塊鏈加密技術數據

2024-06-24 21:24:12

云計算云網絡

2022-09-14 09:45:15

指標標簽

2012-07-25 15:45:28

ERPSCM

2022-11-22 10:21:23

5GLTE

2024-02-21 14:37:56

2023-02-01 08:11:40

系統調用函數

2014-11-26 17:42:00

亞馬遜互聯網阿里巴巴

2021-01-13 09:27:31

微服務API分布式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲人人 | 男人的天堂在线视频 | 久草免费在线视频 | 91精品国产91久久久久久 | 久久综合一区二区三区 | 中文字幕视频免费 | 中文在线а√在线8 | 色视频欧美 | 亚洲v日韩v综合v精品v | 欧美成人高清视频 | 一级黄色片网址 | 国产亚洲欧美在线视频 | 久久久精品一区 | 国产男人的天堂 | 91免费在线 | 91精品在线播放 | 午夜爽爽爽男女免费观看 | 国产美女在线播放 | 91av在线电影| 91麻豆精品国产91久久久更新资源速度超快 | 日韩一区二区三区视频在线观看 | 久久国产精品视频 | 国精品一区 | 欧美性tv| 成人久久 | 日韩国产在线 | 最新国产精品 | 日韩精品一区在线观看 | 天堂亚洲网 | 黄色大片视频 | 免费精品| 日韩中文字幕一区 | 精品视频久久久久久 | 日韩三级在线 | 成人免费淫片aa视频免费 | 国产男女猛烈无遮掩视频免费网站 | 日韩色图视频 | 久久影院一区 | 欧美亚洲国产一区二区三区 | 欧美日韩在线视频一区二区 | 你懂的国产|