vocus logo

方格子 vocus

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

鱈魚-avatar-img
發佈於Vue
更新 發佈閱讀 4 分鐘
鱈魚的魚缸搬家了!新家文章皆有重新修訂,歡迎來新家看看喔。(´▽`ʃ♡ƪ)


vocus|新世代的創作平台


最近注意到 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內容數
各種鱈魚滾鍵盤的雜紀
鱈魚的魚缸的其他內容
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
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
想像一下,你今天醒來,發現整個世界似乎都停止運轉了。這不是科幻電影的情節,而是2024年7月19日真實發生的事件。一家頂級網絡安全公司的一個小失誤,竟然造成了全球範圍內的混亂。讓我們一起深入了解這場前所未有的技術災難。
Thumbnail
想像一下,你今天醒來,發現整個世界似乎都停止運轉了。這不是科幻電影的情節,而是2024年7月19日真實發生的事件。一家頂級網絡安全公司的一個小失誤,竟然造成了全球範圍內的混亂。讓我們一起深入了解這場前所未有的技術災難。
Thumbnail
如果遇到有人要你刪影片時,請留意其理由的正當性。 有時是避免重要細節被發現,有時是避免混入的破壞份子被識別,有時是要避免可以跟謊言對抗的真相被看到,有時是打擊熱門影片達到輿論影響力的限縮。 最常用的第一個錯誤理由是,違法行為會被警察發現。事實上(幾乎)所有直播都會被警察、中共、好事者備份。
Thumbnail
如果遇到有人要你刪影片時,請留意其理由的正當性。 有時是避免重要細節被發現,有時是避免混入的破壞份子被識別,有時是要避免可以跟謊言對抗的真相被看到,有時是打擊熱門影片達到輿論影響力的限縮。 最常用的第一個錯誤理由是,違法行為會被警察發現。事實上(幾乎)所有直播都會被警察、中共、好事者備份。
Thumbnail
同學在顯化班常面臨『能量黑洞』困擾,想解決這個問題嗎?這篇文章將告訴你『能量黑洞』的三大流程,以及如何避免成為『能量充電站』。學會了這些,你的世界才會因你變好。
Thumbnail
同學在顯化班常面臨『能量黑洞』困擾,想解決這個問題嗎?這篇文章將告訴你『能量黑洞』的三大流程,以及如何避免成為『能量充電站』。學會了這些,你的世界才會因你變好。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
【駭入別人銷售漏斗,模仿驗證有效流程】
Thumbnail
【駭入別人銷售漏斗,模仿驗證有效流程】
Thumbnail
數位戒嚴時期,將要進入大拆解時代。基於對產品的不信任,從浮空汽車、空調到枕邊的智能熱水壺都可能被人們拆解或丟棄。它可不是一種運動,因為一旦形成集會,它就犯法。它只是作為人類最基礎的本能而已。
Thumbnail
數位戒嚴時期,將要進入大拆解時代。基於對產品的不信任,從浮空汽車、空調到枕邊的智能熱水壺都可能被人們拆解或丟棄。它可不是一種運動,因為一旦形成集會,它就犯法。它只是作為人類最基礎的本能而已。
Thumbnail
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
Thumbnail
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News