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

鱈魚-avatar-img
發佈於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。…(›´ω`‹ )

留言
avatar-img
留言分享你的想法!
avatar-img
鱈魚的魚缸
17會員
14內容數
各種鱈魚滾鍵盤的雜紀
鱈魚的魚缸的其他內容
2024/07/25
先前提到 Quasar 的 Dialog Plugin 很好用,再讓我補充一個用法。
Thumbnail
2024/07/25
先前提到 Quasar 的 Dialog Plugin 很好用,再讓我補充一個用法。
Thumbnail
2024/07/15
Quasar Dialog 的 Invoking custom component 很好用,但是有些困擾的地方,一起來看看有甚麼辦法吧。
Thumbnail
2024/07/15
Quasar Dialog 的 Invoking custom component 很好用,但是有些困擾的地方,一起來看看有甚麼辦法吧。
Thumbnail
2024/07/10
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
2024/07/10
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
想像一下,你今天醒來,發現整個世界似乎都停止運轉了。這不是科幻電影的情節,而是2024年7月19日真實發生的事件。一家頂級網絡安全公司的一個小失誤,竟然造成了全球範圍內的混亂。讓我們一起深入了解這場前所未有的技術災難。
Thumbnail
想像一下,你今天醒來,發現整個世界似乎都停止運轉了。這不是科幻電影的情節,而是2024年7月19日真實發生的事件。一家頂級網絡安全公司的一個小失誤,竟然造成了全球範圍內的混亂。讓我們一起深入了解這場前所未有的技術災難。
Thumbnail
【駭入別人銷售漏斗,模仿驗證有效流程】
Thumbnail
【駭入別人銷售漏斗,模仿驗證有效流程】
Thumbnail
如果遇到有人要你刪影片時,請留意其理由的正當性。 有時是避免重要細節被發現,有時是避免混入的破壞份子被識別,有時是要避免可以跟謊言對抗的真相被看到,有時是打擊熱門影片達到輿論影響力的限縮。 最常用的第一個錯誤理由是,違法行為會被警察發現。事實上(幾乎)所有直播都會被警察、中共、好事者備份。
Thumbnail
如果遇到有人要你刪影片時,請留意其理由的正當性。 有時是避免重要細節被發現,有時是避免混入的破壞份子被識別,有時是要避免可以跟謊言對抗的真相被看到,有時是打擊熱門影片達到輿論影響力的限縮。 最常用的第一個錯誤理由是,違法行為會被警察發現。事實上(幾乎)所有直播都會被警察、中共、好事者備份。
Thumbnail
同學在顯化班常面臨『能量黑洞』困擾,想解決這個問題嗎?這篇文章將告訴你『能量黑洞』的三大流程,以及如何避免成為『能量充電站』。學會了這些,你的世界才會因你變好。
Thumbnail
同學在顯化班常面臨『能量黑洞』困擾,想解決這個問題嗎?這篇文章將告訴你『能量黑洞』的三大流程,以及如何避免成為『能量充電站』。學會了這些,你的世界才會因你變好。
Thumbnail
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
Thumbnail
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
數位戒嚴時期,將要進入大拆解時代。基於對產品的不信任,從浮空汽車、空調到枕邊的智能熱水壺都可能被人們拆解或丟棄。它可不是一種運動,因為一旦形成集會,它就犯法。它只是作為人類最基礎的本能而已。
Thumbnail
數位戒嚴時期,將要進入大拆解時代。基於對產品的不信任,從浮空汽車、空調到枕邊的智能熱水壺都可能被人們拆解或丟棄。它可不是一種運動,因為一旦形成集會,它就犯法。它只是作為人類最基礎的本能而已。
Thumbnail
在現實生活中,充滿的警報及安全措施,總會設個安全線在那,若觸碰到底線時則會有警報響起。 在Python也有類似的作法,如果希望在某個條件達到時,就拉起警報不要讓程式繼續進行下去,就適合使用raise 這種機制讓開發者能夠在程序執行時檢測到不正確的條件,然後通過引發異常停止程序的執行或通知使用者。
Thumbnail
在現實生活中,充滿的警報及安全措施,總會設個安全線在那,若觸碰到底線時則會有警報響起。 在Python也有類似的作法,如果希望在某個條件達到時,就拉起警報不要讓程式繼續進行下去,就適合使用raise 這種機制讓開發者能夠在程序執行時檢測到不正確的條件,然後通過引發異常停止程序的執行或通知使用者。
Thumbnail
誤發的防空警報,不確定是哪一個局處、哪一個科長、哪一個科員要負責的 也有可能是中科院的雷達的軟體設定 在發現長征火箭發射 預先設置好的文字,在軟體警示後 在情急之下,沒有修改到 這是一個烏龍,但還有很多更重要的事
Thumbnail
誤發的防空警報,不確定是哪一個局處、哪一個科長、哪一個科員要負責的 也有可能是中科院的雷達的軟體設定 在發現長征火箭發射 預先設置好的文字,在軟體警示後 在情急之下,沒有修改到 這是一個烏龍,但還有很多更重要的事
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News