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

鱈魚
發佈於Vue
閱讀時間約 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。…(›´ω`‹ )

6會員
9內容數
各種鱈魚滾鍵盤的雜紀
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
【2024 結婚好日子】113 年排除鬼月「宜嫁娶假日」僅 31 天,婚期還沒訂小心來不及!2024 結婚好日子天數不多,想在吉日辦婚禮要加緊腳步了!許多新人即使不請老師擇日合八字,仍會看 113 年農民曆「宜嫁娶」挑日子,黃曆寫忌嫁娶要迴避、辦在鬼月長輩有忌諱、平日婚宴親友不方便,東扣西扣能辦喜事的假日所剩無幾。 下面幫大家整理出 2024 農曆宜嫁娶好日...
Thumbnail
avatar
陳年小被被
2024-05-29
利用分年免除買賣價金債務來移轉不動產,小心搞錯了會繳更多增值稅財產、遺產、不動產的規劃傳承,不僅應考慮能否依照自己的意願分配,還須一併考慮稅捐的負擔,否則子女實際取得的部分可能較原本的安排少了一大部分,資產規劃不僅有法律面的問題,還有不動產交易制度及稅捐的問題,在以買賣為原因移轉所有權時,應注意一生一次自用增值稅與年度贈與稅免稅額,二者如何選擇適用較有利。
avatar
粘毅群律師
2023-12-28
都更後移轉房屋所有權,小心喪失房屋稅減半徵收優惠都市更新後新建房屋的房屋稅減半徵收10年規定,在新建房屋由參與都市更新者移轉第三人後,第三人無從再享有房屋稅減半徵收10年的優惠,於第三人以繼承為原因取得者,亦同樣無法再享有減半徵收10年的優惠。
avatar
粘毅群律師
2023-09-14
愛美要小心!山寨「鳳凰電波後遺症」恐嚴重燙傷 鳳凰電波為什麼這麼夯?除了比起前幾代更能均勻輸出熱能,安全性提高很多,術後也能感受到皮膚緊緻,約2到3個月後,增生膠原蛋白效果更明顯。不過,鳳凰電波也有許多注意事項與維護須知,本文將為你解答。 鳳凰電波是什麼?緊緻我的肌膚! 鳳凰電波又名電波拉皮、電波拉提,是將高頻電波打入皮膚真皮層的
Thumbnail
avatar
PinMed - 24/7預約你的看診醫師
2023-08-14
美容儀、美容棒可以抗老?小心老化的更快!現在的人越來越愛美~不分男女、年紀,都很注重「抗老」!市面上琳琅滿目的產品也有非常多標榜可以抗老,例如幫助緊緻?拉提?通常一般人可能會加臉部按摩,或是使用一些簡易的美容儀器,目的就是為了能夠自己的狀態可以更加完美。但其實有很多方法都是錯誤的!可能還會促使皮膚更快老化!!
Thumbnail
avatar
抗痘傳教士Alan
2023-07-27
遺產配偶可以先拿?小心因此惹上官司資深藝人顧寶明於2022年3月離世,但近日爆出他的女兒及第3任妻子因為遺產爭議鬧上法院。據《鏡週刊》報導,顧寶明去世後,女兒清查遺產,發現繼母在父親死後10天,將他名下價值逾1千萬元的存款、股票和外幣陸續轉進自己個人帳戶,宣稱因為財產是夫妻共有。但法律是這樣規定的嗎?
Thumbnail
avatar
陳建至律師
2023-03-22
在時光列車中,不小心遺失了妳在每個時光列車的轉乘之中,可能不小心遺失了故人。
Thumbnail
avatar
Vanessa Li
2023-03-17
支票不能謊報遺失!小心誣告刑責!許多人做生意,習慣用支票作為付款方式,但也常聽到因為種種原因,不想讓票據兌現,於是謊報票據遺失,但這動作其實會涉及刑法上誣告罪的刑責!一起來看看這篇文章的解說吧!
Thumbnail
avatar
法律生活頻道(呂昀叡律師)
2022-07-25
繼承者小心,做了這些事可能訴訟纏身,甚至對遺留債務變成無限責任!最近和幾位朋友吃飯聊到申報遺產稅,其中朋友聊到有朋友為了將老爸的房子趕快賣出去,用了比當時市價還便宜的價錢賣掉了。我說如果那位朋友的老爸的債務大於資產,那位朋友這樣處理可能會導致訴訟纏身,甚至他必須對老爸遺留的債務負無限責任。為什麼?請見本文說明。
Thumbnail
avatar
P律師
2022-03-21