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)依賴變化時(shí)重新執(zhí)行函數(shù),無需手動指定監(jiān)聽源。
它是watch的“簡化版”,專注于“副作用響應(yīng)”,解決了watch需手動指定依賴的繁瑣問題。
二、工作原理
基于Vue3響應(yīng)式系統(tǒng)的ReactiveEffect實(shí)現(xiàn):
- 執(zhí)行watchEffect傳入的副作用函數(shù),此時(shí)會觸發(fā)響應(yīng)式數(shù)據(jù)的getter
- 自動收集函數(shù)內(nèi)訪問的所有響應(yīng)式依賴(依賴追蹤)
- 當(dāng)依賴變化時(shí),觸發(fā)setter,重新執(zhí)行副作用函數(shù)
- 組件卸載時(shí),自動停止偵聽,避免內(nèi)存泄漏
三、核心特性
- 自動收集依賴:無需像watch那樣手動指定監(jiān)聽源,函數(shù)內(nèi)用到的響應(yīng)式數(shù)據(jù)都會被追蹤
- 立即執(zhí)行:默認(rèn)首次渲染就執(zhí)行一次,無需配置immediate
- 自動清理:支持通過onInvalidate清理副作用(如移除事件監(jiān)聽、取消請求)
- 自動停止:在
四、實(shí)戰(zhàn)用法示例
4.1 基礎(chǔ)用法(修改頁面標(biāo)題)
<script setup>
import { ref, watchEffect } from 'vue'
const count = ref(0)
// 自動追蹤count,count變化時(shí)重新執(zhí)行
watchEffect(() => {
document.title = `當(dāng)前計(jì)數(shù):${count.value}`
})
</script>4.2 自動清理副作用
<script setup>
import { watchEffect } from 'vue'
watchEffect((onInvalidate) => {
// 綁定事件監(jiān)聽
const handleClick = () => console.log('點(diǎn)擊事件')
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)
})
// 滿足條件時(shí)停止偵聽
if (count.value > 5) {
stop()
}
</script>五、與watch的核心區(qū)別
| 對比維度 | watchEffect | watch |
|---|---|---|
| 依賴收集 | 自動收集函數(shù)內(nèi)依賴 | 需手動指定監(jiān)聽源 |
| 觸發(fā)時(shí)機(jī) | 默認(rèn)立即執(zhí)行 | 默認(rèn)惰性執(zhí)行(需immediate開啟) |
| 舊值獲取 | 不支持 | 支持(newVal, oldVal) |
| 適用場景 | 動態(tài)依賴、簡單副作用 | 舊值對比、節(jié)流防抖、異步請求 |
六、常見避坑點(diǎn)
- 副作用堆積:未清理副作用(如事件監(jiān)聽、定時(shí)器),導(dǎo)致多次執(zhí)行后重復(fù)綁定,需用onInvalidate清理
- 依賴未追蹤:函數(shù)內(nèi)未直接訪問響應(yīng)式數(shù)據(jù)(如嵌套過深未觸發(fā)getter),需確保依賴被直接訪問
- 異步邏輯問題:異步操作內(nèi)的響應(yīng)式數(shù)據(jù)不會被追蹤,需將依賴寫在同步代碼中
七、核心總結(jié)
watchEffect核心價(jià)值是“簡化響應(yīng)式偵聽”,無需手動指定依賴,適合動態(tài)依賴、簡單副作用場景(如DOM操作、頁面標(biāo)題修改、臨時(shí)調(diào)試)。記住3個(gè)關(guān)鍵點(diǎn):
- 自動收集依賴,無需手動配置監(jiān)聽源
- 首次立即執(zhí)行,依賴變化重新執(zhí)行
- 必做:用onInvalidate清理副作用,避免內(nèi)存泄漏
與watch互補(bǔ)使用,簡單副作用用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)聽實(shí)現(xiàn)源碼解析
這篇文章主要為大家介紹了Vue 組件事件觸發(fā)和監(jiān)聽實(shí)現(xiàn)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Vue3中使用i18n,this.$t報(bào)錯(cuò)問題及解決
這篇文章主要介紹了Vue3中使用i18n,this.$t報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
vue+quasar使用遞歸實(shí)現(xiàn)動態(tài)多級菜單
這篇文章主要為大家詳細(xì)介紹了vue+quasar使用遞歸實(shí)現(xiàn)動態(tài)多級菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Vue CLI 3.x 自動部署項(xiàng)目至服務(wù)器的方法
本教程講解的是 Vue-CLI 3.x 腳手架搭建的vue項(xiàng)目, 利用scp2自動化部署到靜態(tài)文件服務(wù)器 Nginx。非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-04-04
vue使用axios實(shí)現(xiàn)excel文件下載的功能
這篇文章主要介紹了vue中使用axios實(shí)現(xiàn)excel文件下載的功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
el-date-picker日期選擇限制范圍的實(shí)例代碼
這篇文章主要介紹了el-date-picker日期選擇限制范圍,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09

