Vue3 watchEffect核心用法與原理解析
一、什么是watchEffect?
watchEffect是Vue3組合式API提供的響應(yīng)式偵聽器,用于監(jiān)聽響應(yīng)式數(shù)據(jù)變化并執(zhí)行副作用邏輯。核心定義:立即執(zhí)行一次副作用函數(shù),自動追蹤函數(shù)內(nèi)訪問的響應(yīng)式數(shù)據(jù),當(dāng)依賴變化時重新執(zhí)行函數(shù),無需手動指定監(jiān)聽源。
它是watch的“簡化版”,專注于“副作用響應(yīng)”,解決了watch需手動指定依賴的繁瑣問題。
二、工作原理
基于Vue3響應(yīng)式系統(tǒng)的ReactiveEffect實現(xiàn):
- 執(zhí)行watchEffect傳入的副作用函數(shù),此時會觸發(fā)響應(yīng)式數(shù)據(jù)的getter
- 自動收集函數(shù)內(nèi)訪問的所有響應(yīng)式依賴(依賴追蹤)
- 當(dāng)依賴變化時,觸發(fā)setter,重新執(zhí)行副作用函數(shù)
- 組件卸載時,自動停止偵聽,避免內(nèi)存泄漏
三、核心特性
- 自動收集依賴:無需像watch那樣手動指定監(jiān)聽源,函數(shù)內(nèi)用到的響應(yīng)式數(shù)據(jù)都會被追蹤
- 立即執(zhí)行:默認首次渲染就執(zhí)行一次,無需配置immediate
- 自動清理:支持通過onInvalidate清理副作用(如移除事件監(jiān)聽、取消請求)
- 自動停止:在
四、實戰(zhàn)用法示例
4.1 基礎(chǔ)用法(修改頁面標(biāo)題)
<script setup>
import { ref, watchEffect } from 'vue'
const count = ref(0)
// 自動追蹤count,count變化時重新執(zhí)行
watchEffect(() => {
document.title = `當(dāng)前計數(shù):${count.value}`
})
</script>4.2 自動清理副作用
<script setup>
import { watchEffect } from 'vue'
watchEffect((onInvalidate) => {
// 綁定事件監(jiān)聽
const handleClick = () => console.log('點擊事件')
document.addEventListener('click', handleClick)
// 依賴變化/組件卸載前清理
onInvalidate(() => {
document.removeEventListener('click', handleClick)
})
})
</script>4.3 手動停止偵聽
<script setup>
import { ref, watchEffect } from 'vue'
const count = ref(0)
// watchEffect返回停止函數(shù)
const stop = watchEffect(() => {
console.log('count值:', count.value)
})
// 滿足條件時停止偵聽
if (count.value > 5) {
stop()
}
</script>五、與watch的核心區(qū)別
| 對比維度 | watchEffect | watch |
|---|---|---|
| 依賴收集 | 自動收集函數(shù)內(nèi)依賴 | 需手動指定監(jiān)聽源 |
| 觸發(fā)時機 | 默認立即執(zhí)行 | 默認惰性執(zhí)行(需immediate開啟) |
| 舊值獲取 | 不支持 | 支持(newVal, oldVal) |
| 適用場景 | 動態(tài)依賴、簡單副作用 | 舊值對比、節(jié)流防抖、異步請求 |
六、常見避坑點
- 副作用堆積:未清理副作用(如事件監(jiān)聽、定時器),導(dǎo)致多次執(zhí)行后重復(fù)綁定,需用onInvalidate清理
- 依賴未追蹤:函數(shù)內(nèi)未直接訪問響應(yīng)式數(shù)據(jù)(如嵌套過深未觸發(fā)getter),需確保依賴被直接訪問
- 異步邏輯問題:異步操作內(nèi)的響應(yīng)式數(shù)據(jù)不會被追蹤,需將依賴寫在同步代碼中
七、核心總結(jié)
watchEffect核心價值是“簡化響應(yīng)式偵聽”,無需手動指定依賴,適合動態(tài)依賴、簡單副作用場景(如DOM操作、頁面標(biāo)題修改、臨時調(diào)試)。記住3個關(guān)鍵點:
- 自動收集依賴,無需手動配置監(jiān)聽源
- 首次立即執(zhí)行,依賴變化重新執(zhí)行
- 必做:用onInvalidate清理副作用,避免內(nèi)存泄漏
與watch互補使用,簡單副作用用watchEffect,需舊值對比、異步節(jié)流用watch,高效駕馭Vue3響應(yīng)式偵聽。
到此這篇關(guān)于Vue3 watchEffect詳解:核心用法與原理剖析的文章就介紹到這了,更多相關(guān)Vue3 watchEffect用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Vue3中watch與watchEffect使用方法詳解
- Vue3?watchEffect的使用教程和相關(guān)概念
- Vue3中Watch、Watcheffect、Computed的使用和區(qū)別解析
- Vue3中watchEffect高級偵聽器的具體使用
- Vue3.0監(jiān)聽器watch與watchEffect詳解
- Vue3中watchEffect和watch的基礎(chǔ)應(yīng)用詳解
- vue3數(shù)據(jù)監(jiān)聽watch/watchEffect的示例代碼
- vue3中watch與watchEffect的區(qū)別
- 詳解Vue3中的watch偵聽器和watchEffect高級偵聽器
- 一文搞懂Vue3中watchEffect偵聽器的使用
相關(guān)文章
Vue 組件事件觸發(fā)和監(jiān)聽實現(xiàn)源碼解析
這篇文章主要為大家介紹了Vue 組件事件觸發(fā)和監(jiān)聽實現(xiàn)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
vue+quasar使用遞歸實現(xiàn)動態(tài)多級菜單
這篇文章主要為大家詳細介紹了vue+quasar使用遞歸實現(xiàn)動態(tài)多級菜單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07
vue使用axios實現(xiàn)excel文件下載的功能
這篇文章主要介紹了vue中使用axios實現(xiàn)excel文件下載的功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07

