小心遺漏的 watch 讓網頁爆炸!Σ(ˊДˋ;)

更新於 2024/08/26閱讀時間約 4 分鐘
鱈魚的魚缸搬家了!新家文章皆有重新修訂,歡迎來新家看看喔。(´▽`ʃ♡ƪ)


raw-image


最近注意到 watch 有一個有趣的現象,一個可能會挖坑的現象。(´,,•ω•,,)


在某些情境下,watch 的位置可能不會在元件最外層。


類似這種感覺:

<script setup>
import { ref, watch} from 'vue'

const data = ref(1);

setTimeout(() => {
watch(data, (value) => {
console.log('[ Comp ] data: ', value);
})
}, 500);
</script>

先別吐槽這樣寫超廢,只是個簡單的示意啦。¯\( ͡° ͜ʖ ͡°)


(其實如果有這類需求,推薦使用 VueUse 提供的 watchPausable、watchTriggerable 這類進階版 watch,看起來更漂亮、更好維護。)


一般我們知道,元件 onUnmounted 後,watch 就會自動解除。


但是如果是剛剛的那個例子,onUnmounted 後 watch 不會自動解除喲!ლ(╹◡╹ლ)


所以如果頁面中有很多這類 watch,很有可能讓網頁爆掉唷!o(≧∀≦)o


路人:「是在開心個毛線喔。(゚Д゚*)ノ」


這是因為如果在內層呼叫 watch,會讓 watch 與元件處在不同 effectScope,導致此結果。


解法也很簡單,勤奮一點手動解除。◝( •ω• )◟

<script setup>
import { ref, watch } from 'vue'

const data = ref(1);

let unwatch;
setTimeout(() => {
unwatch = watch(data, (value) => {
console.log('[ CompUnwatch ] data: ', value);
})
}, 500);

onUnmounted(() => {
console.log('[ onUnmounted ]');
unwatch();
})
</script>

路人:「啊如果有很多 watch,這樣一個一個解除很累欸。Σ(ˊДˋ;)」


鱈魚:「…('◉◞⊖◟◉` ),先不探究這種 code 怎麼過得了 code review ,假設真的有很多 watch 要解除,可以用剛剛提到的關鍵字『effectScope』」


effectScope 可以用來捕捉範圍內的 reactive effects,所以可以把所有的 watch 收集起來統一解除。


例如像這樣:

<script setup>
import { ref, watch, onUnmounted, effectScope } from 'vue'

const scope = effectScope()
const data = ref(1);
const number = ref(0);

setTimeout(() => {
scope.run(() => {
watch(data, (value) => {
console.log('[ CompScope ] data: ', value);
})
})
}, 500);

setTimeout(() => {
scope.run(() => {
watch(number, (value) => {
console.log('[ CompScope ] number: ', value);
})
})
}, 1000);

onUnmounted(() => {
console.log('[ onUnmounted ]');
scope.stop();
})
</script>

世界再度回復和平!✧*。٩(ˊᗜˋ*)و✧*。


以上提到的範例可以在此連結查看

(可以觀察到即使元件消失後,devtool 的 console 依舊持續跑出 log)


不過說的真,請不要這樣用 watch。…(›´ω`‹ )

avatar-img
17會員
14內容數
各種鱈魚滾鍵盤的雜紀
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
2024 結婚好日子天數不多,想在吉日辦婚禮要加緊腳步了!許多新人即使不請老師擇日合八字,仍會看 113 年農民曆「宜嫁娶」挑日子,黃曆寫忌嫁娶要迴避、辦在鬼月長輩有忌諱、平日婚宴親友不方便,東扣西扣能辦喜事的假日所剩無幾。
財產、遺產、不動產的規劃傳承,不僅應考慮能否依照自己的意願分配,還須一併考慮稅捐的負擔,否則子女實際取得的部分可能較原本的安排少了一大部分,資產規劃不僅有法律面的問題,還有不動產交易制度及稅捐的問題,在以買賣為原因移轉所有權時,應注意一生一次自用增值稅與年度贈與稅免稅額,二者如何選擇適用較有利。
都市更新後新建房屋的房屋稅減半徵收10年規定,在新建房屋由參與都市更新者移轉第三人後,第三人無從再享有房屋稅減半徵收10年的優惠,於第三人以繼承為原因取得者,亦同樣無法再享有減半徵收10年的優惠。
Thumbnail
鳳凰電波為什麼這麼夯?除了比起前幾代更能均勻輸出熱能,安全性提高很多,術後也能感受到皮膚緊緻,約2到3個月後,增生膠原蛋白效果更明顯。不過,鳳凰電波也有許多注意事項與維護須知,本文將為你解答。 鳳凰電波是什麼?緊緻我的肌膚! 鳳凰電波又名電波拉皮、電波拉提,是將高頻電波打入皮膚真皮層的
Thumbnail
現在的人越來越愛美~不分男女、年紀,都很注重「抗老」!市面上琳琅滿目的產品也有非常多標榜可以抗老,例如幫助緊緻?拉提?通常一般人可能會加臉部按摩,或是使用一些簡易的美容儀器,目的就是為了能夠自己的狀態可以更加完美。但其實有很多方法都是錯誤的!可能還會促使皮膚更快老化!!
Thumbnail
資深藝人顧寶明於2022年3月離世,但近日爆出他的女兒及第3任妻子因為遺產爭議鬧上法院。據《鏡週刊》報導,顧寶明去世後,女兒清查遺產,發現繼母在父親死後10天,將他名下價值逾1千萬元的存款、股票和外幣陸續轉進自己個人帳戶,宣稱因為財產是夫妻共有。但法律是這樣規定的嗎?
Thumbnail
在每個時光列車的轉乘之中,可能不小心遺失了故人。
Thumbnail
許多人做生意,習慣用支票作為付款方式,但也常聽到因為種種原因,不想讓票據兌現,於是謊報票據遺失,但這動作其實會涉及刑法上誣告罪的刑責!一起來看看這篇文章的解說吧!
Thumbnail
最近和幾位朋友吃飯聊到申報遺產稅,其中朋友聊到有朋友為了將老爸的房子趕快賣出去,用了比當時市價還便宜的價錢賣掉了。我說如果那位朋友的老爸的債務大於資產,那位朋友這樣處理可能會導致訴訟纏身,甚至他必須對老爸遺留的債務負無限責任。為什麼?請見本文說明。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
2024 結婚好日子天數不多,想在吉日辦婚禮要加緊腳步了!許多新人即使不請老師擇日合八字,仍會看 113 年農民曆「宜嫁娶」挑日子,黃曆寫忌嫁娶要迴避、辦在鬼月長輩有忌諱、平日婚宴親友不方便,東扣西扣能辦喜事的假日所剩無幾。
財產、遺產、不動產的規劃傳承,不僅應考慮能否依照自己的意願分配,還須一併考慮稅捐的負擔,否則子女實際取得的部分可能較原本的安排少了一大部分,資產規劃不僅有法律面的問題,還有不動產交易制度及稅捐的問題,在以買賣為原因移轉所有權時,應注意一生一次自用增值稅與年度贈與稅免稅額,二者如何選擇適用較有利。
都市更新後新建房屋的房屋稅減半徵收10年規定,在新建房屋由參與都市更新者移轉第三人後,第三人無從再享有房屋稅減半徵收10年的優惠,於第三人以繼承為原因取得者,亦同樣無法再享有減半徵收10年的優惠。
Thumbnail
鳳凰電波為什麼這麼夯?除了比起前幾代更能均勻輸出熱能,安全性提高很多,術後也能感受到皮膚緊緻,約2到3個月後,增生膠原蛋白效果更明顯。不過,鳳凰電波也有許多注意事項與維護須知,本文將為你解答。 鳳凰電波是什麼?緊緻我的肌膚! 鳳凰電波又名電波拉皮、電波拉提,是將高頻電波打入皮膚真皮層的
Thumbnail
現在的人越來越愛美~不分男女、年紀,都很注重「抗老」!市面上琳琅滿目的產品也有非常多標榜可以抗老,例如幫助緊緻?拉提?通常一般人可能會加臉部按摩,或是使用一些簡易的美容儀器,目的就是為了能夠自己的狀態可以更加完美。但其實有很多方法都是錯誤的!可能還會促使皮膚更快老化!!
Thumbnail
資深藝人顧寶明於2022年3月離世,但近日爆出他的女兒及第3任妻子因為遺產爭議鬧上法院。據《鏡週刊》報導,顧寶明去世後,女兒清查遺產,發現繼母在父親死後10天,將他名下價值逾1千萬元的存款、股票和外幣陸續轉進自己個人帳戶,宣稱因為財產是夫妻共有。但法律是這樣規定的嗎?
Thumbnail
在每個時光列車的轉乘之中,可能不小心遺失了故人。
Thumbnail
許多人做生意,習慣用支票作為付款方式,但也常聽到因為種種原因,不想讓票據兌現,於是謊報票據遺失,但這動作其實會涉及刑法上誣告罪的刑責!一起來看看這篇文章的解說吧!
Thumbnail
最近和幾位朋友吃飯聊到申報遺產稅,其中朋友聊到有朋友為了將老爸的房子趕快賣出去,用了比當時市價還便宜的價錢賣掉了。我說如果那位朋友的老爸的債務大於資產,那位朋友這樣處理可能會導致訴訟纏身,甚至他必須對老爸遺留的債務負無限責任。為什麼?請見本文說明。