Vue3中watchEffect的用途淺析
前言
vue2里面的 watch api 大家應(yīng)該都挺熟悉的了, vue2中vue實例里面有一個 $watch 方法 在sfc(sigle file component)里面有一個 watch 選項。他可以實現(xiàn)在一個屬性變更的時候,去執(zhí)行我們想要的行為。比如:
- 當(dāng)ID改變的時候,從數(shù)據(jù)庫里面獲取新的數(shù)據(jù)。
- 當(dāng)屬性變換的時候執(zhí)行一個動畫。
- 當(dāng)搜索條件變更的時候,更新查詢到的數(shù)據(jù)。
但是 vue3 除了 watch api, 還新增了一個 watchEffect 的 api, 我們來看看他的用法。
我們收集了一個 userID 的依賴,然后在 userID 改變的時候,就會執(zhí)行watchEffect 的回調(diào)。
// 例子靈感來源于[文檔](https://v3.vuejs.org/api/computed-watch-api.html#watcheffect) import { watchEffect, ref } from 'vue' setup () { const userID = ref(0) watchEffect(() => console.log(userID)) setTimeout(() => { userID.value = 1 }, 1000) /* * LOG * 0 * 1 */ return { userID } }
與 watch 有什么不同?
- 第一點我們可以從示例代碼中看到 watchEffect 不需要指定監(jiān)聽的屬性,他會自動的收集依賴, 只要我們回調(diào)中引用到了 響應(yīng)式的屬性, 那么當(dāng)這些屬性變更的時候,這個回調(diào)都會執(zhí)行,而 watch 只能監(jiān)聽指定的屬性而做出變更(v3開始可以同時指定多個)。
- 第二點就是 watch 可以獲取到新值與舊值(更新前的值),而 watchEffect 是拿不到的。
- 第三點是 watchEffect 如果存在的話,在組件初始化的時候就會執(zhí)行一次用以收集依賴(與computed同理),而后收集到的依賴發(fā)生變化,這個回調(diào)才會再次執(zhí)行,而 watch 不需要,因為他一開始就指定了依賴。
從他們的不同點可以看出,他們的優(yōu)缺點。并且可以在業(yè)務(wù)需求面前做出正確的選擇。
watchEffect 進(jìn)階
停止監(jiān)聽
watchEffect 會返回一個用于停止這個監(jiān)聽的函數(shù),如法如下:
const stop = watchEffect(() => { /* ... */ }) // later stop()
例子來源于官方文檔, 上面有鏈接。
如果 watchEffect 是在 setup 或者 生命周期里面注冊的話,在組件取消掛載的時候會自動的停止掉。
使 side effect 無效
什么是 side effect ,不可預(yù)知的接口請求就是一個 side effect,假設(shè)我們現(xiàn)在用一個用戶ID去查詢用戶的詳情信息,然后我們監(jiān)聽了這個用戶ID, 當(dāng)用戶ID 改變的時候我們就會去發(fā)起一次請求,這很簡單,用watch 就可以做到。 但是如果在請求數(shù)據(jù)的過程中,我們的用戶ID發(fā)生了多次變化,那么我們就會發(fā)起多次請求,而最后一次返回的數(shù)據(jù)將會覆蓋掉我們之前返回的所有用戶詳情。這不僅會導(dǎo)致資源浪費,還無法保證 watch 回調(diào)執(zhí)行的順序。而使用 watchEffect 我們就可以做到。
onInvalidate()
onInvalidate(fn)傳入的回調(diào)會在 watchEffect 重新運行或者 watchEffect 停止的時候執(zhí)行
watchEffect(() => { // 異步api調(diào)用,返回一個操作對象 const apiCall = someAsyncMethod(props.userID) onInvalidate(() => { // 取消異步api的調(diào)用。 apiCall.cancel() }) })
借助 onInvalidate 我們就可以對上面所述的情況作出比較優(yōu)雅的優(yōu)化。
總結(jié)
到此這篇關(guān)于Vue3中watchEffect用途的文章就介紹到這了,更多相關(guān)Vue3 watchEffect用途內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解Vue3?中的watchEffect?特性
- vue3數(shù)據(jù)監(jiān)聽watch/watchEffect的示例代碼
- vue3中watch與watchEffect的區(qū)別
- vue3中watch和watchEffect實戰(zhàn)梳理
- Vue3中的?computed,watch,watchEffect的使用方法
- Vue3?中?watch?與?watchEffect?區(qū)別及用法小結(jié)
- vue3中的watch和watchEffect實例詳解
- 淺談Vue3中watchEffect的具體用法
- vue3的watch和watchEffect你了解嗎
- VUE3中watch和watchEffect的用法詳解
- vue3中watch和watchEffect的區(qū)別
相關(guān)文章
解決element-ui中Popconfirm氣泡確認(rèn)框的事件不生效問題
這篇文章主要介紹了解決element-ui中Popconfirm氣泡確認(rèn)框的事件不生效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07聊聊Vue中provide/inject的應(yīng)用詳解
這篇文章主要介紹了聊聊Vue中provide/inject的應(yīng)用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11解決vue里a標(biāo)簽值解析變量,跳轉(zhuǎn)頁面,前面加默認(rèn)域名端口的問題
這篇文章主要介紹了解決vue里a標(biāo)簽值解析變量,跳轉(zhuǎn)頁面,前面加默認(rèn)域名端口的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07Vue新手指南之創(chuàng)建第一個vue-cli腳手架程序
vue-cli 是一個官方發(fā)布 vue.js 項目腳手架,使用 vue-cli 可以快速創(chuàng)建 vue 項目。這篇文章主要給大家介紹了關(guān)于Vue新手指南之創(chuàng)建第一個vue-cli程序的相關(guān)資料,需要的朋友可以參考下2021-05-05vue element實現(xiàn)表格增加刪除修改數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了vue element實現(xiàn)表格增加刪除修改數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-05-05vue elementUI 表單校驗的實現(xiàn)代碼(多層嵌套)
這篇文章主要介紹了vue elementUI 表單校驗的實現(xiàn)代碼(多層嵌套),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11vue?中使用?this?更新數(shù)據(jù)的一次問題記錄
這篇文章主要介紹了vue?中使用?this?更新數(shù)據(jù)的一次大坑?,我在 vue 實例中聲明了一個數(shù)組屬性如?books: [],在異步請求的回調(diào)函數(shù)中使用?this.books = res.data.data;?進(jìn)行數(shù)據(jù)更新,感興趣的朋友跟隨小編一起看看吧2022-11-11