watch 前先小等一下

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


raw-image


先說結論:

watch 不是不能用,而是在使用 watch 之前,先想想有沒有其他方案,真的沒有才用 watch。


千萬不要為了一時方便讓元件裡滿滿的 watch,因為容易產生難以追蹤的副作用,會讓資料流更加複雜。


口說無憑,讓我們舉個栗子 (。・∀・)ノ🌰。


考慮一個簡單的元件,可以提供數值資料:

<script setup lang="ts">
interface Props {
modelValue?: string | number;
}
const props = withDefaults(defineProps<Props>(), {
modelValue: 0,
});

const emit = defineEmits<{
(e: 'update:modelValue', value: number): void;
}>();

const numberValue = ref(props.modelValue);

watch(() => props.modelValue, (value) => {
numberValue.value = parseFloat(value);
});
</script>

你可能會想問:「阿不是說能不用就不要用,怎麼開場就有 watch?」


這是因為除了 watch 以外,沒有其他方法可以在元件內得知 props.modelValue 發生變更,所以此部分可以使用 watch。

(或是請大家指教其他方法。(. ❛ ᴗ ❛.))。


以上程式已經將 props.modelValue 數值同步至 numberValue 中,現在只差將 numberValue 數值 emit 出去部分,直覺上可能會這樣寫:

<script setup lang="ts">
...

watch(numberValue, (value) => {
emit('update:modelValue', parseFloat(value));
});
</script>

在簡單的例子中,這樣寫不會有太大問題,但是若 numberValue 資料較為複雜(例如深層物件、矩陣等等)或者是資料耦合其他邏輯時,這樣寫可能會導致 watch 無限呼叫或其他難以追蹤的副作用。


一般情況下,我們應該可以直接知道 numberValue 的變化來源。

(如果沒辦法得知,應該重新仔細思考設計)


如果是 input 的話,我們可以從 @change 事件得知數值變化,所以此例子可以不使用 watch,結果可能會這樣:

<script setup lang="ts">
...

function handleUpdate() {
emit('update:modelValue', parseFloat(numberValue.value));
}

// 或是這樣
function handleUpdate(value: string) {
emit('update:modelValue', parseFloat(value));
}
</script>

也就是在明確的資料流中呼叫 emit。


最後讓我們總結一下。(。・∀・)ノ゙


在設計元件時,請讓資料流盡可能單向且單純,以免寫得時候很爽,除錯的時候火葬場。


例如 Vue v-model 的雙向綁定就是一個經典的例子。


大家應該都是知道 v-model 其實是個語法糖,程式碼很簡單時使用 v-model 容易且簡單。


但是一但資料開始複雜時,就會建議拆成 :model-value@update:modelValue 處理(也就是把原本的雙向資料流,拆成兩個單向資料流),彈性更高更可靠。( •̀ ω •́ )✧

(一時想不到有甚麼好例子,有想到再來分享,或是請大家幫忙補充補充。(´▽`ʃ♡ƪ))


但是如果發現元件內有很多「只能用 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
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
Thumbnail
本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
Thumbnail
前言 從零開始構建一個 DateTimePicker 可能看起來令人畏懼,但試想一下你將獲得的靈活性和控制力。在這個系列中,我們將逐步揭開構建過程的神秘面紗,讓您能夠創建一個完全符合需求的自定義 DateTimePicker。 本文章,屬於付費系列的文章,這篇文章,我會希望讀者可以得到的
Thumbnail
前言 從零開始構建一個 DateTimePicker 可能看起來令人畏懼,但試想一下你將獲得的靈活性和控制力。在這個系列中,我們將逐步揭開構建過程的神秘面紗,讓您能夠創建一個完全符合需求的自定義 DateTimePicker。 本文章,屬於付費系列的文章,這篇文章,我會希望讀者可以得到的
Thumbnail
分享一個有趣的套件,名為 await-to-js。 可以讓 Promise 與 await 的寫法更簡潔。
Thumbnail
分享一個有趣的套件,名為 await-to-js。 可以讓 Promise 與 await 的寫法更簡潔。
Thumbnail
本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
Thumbnail
本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
Thumbnail
程式與頻率時間 看起來這個問題有些奇怪,程式與頻率時間有什麼關係呢?一旦程式完成,似乎就不需要再理會頻率和時間了。實際上,這可能是一些不熟悉程式設計的人所提出的疑問。了解程式設計最重要的一點是,頻率和時間的安排會直接影響程式的效能和展現速度。 時間的利用 舉例來說,假設一個表單的每筆處理時間為
Thumbnail
程式與頻率時間 看起來這個問題有些奇怪,程式與頻率時間有什麼關係呢?一旦程式完成,似乎就不需要再理會頻率和時間了。實際上,這可能是一些不熟悉程式設計的人所提出的疑問。了解程式設計最重要的一點是,頻率和時間的安排會直接影響程式的效能和展現速度。 時間的利用 舉例來說,假設一個表單的每筆處理時間為
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
幾天不用,剛剛發現之前的程式碼已經不能使用了,我想可能是因為html結構有所改變,之前的程式碼可以看下面這一篇文章 【程式碼教學】追蹤自己 Vocus文章每日流量,第二版 1027 更新後的程式碼 import csv from bs4 import BeautifulSoup
Thumbnail
幾天不用,剛剛發現之前的程式碼已經不能使用了,我想可能是因為html結構有所改變,之前的程式碼可以看下面這一篇文章 【程式碼教學】追蹤自己 Vocus文章每日流量,第二版 1027 更新後的程式碼 import csv from bs4 import BeautifulSoup
Thumbnail
程式碼第二版 1027 剛剛發現之前的程式碼已經不能使用了,我想可能是因為html結構有所改變,另外也想順便處理一下數字如果是含有"K"的數字時,順便轉化一下,時間有限,所以想知道來龍去脈請看下面文章。 【教學】如何用程式碼追蹤Vocus文章每日流量?第一版 【教學】如何用程式碼追蹤V
Thumbnail
程式碼第二版 1027 剛剛發現之前的程式碼已經不能使用了,我想可能是因為html結構有所改變,另外也想順便處理一下數字如果是含有"K"的數字時,順便轉化一下,時間有限,所以想知道來龍去脈請看下面文章。 【教學】如何用程式碼追蹤Vocus文章每日流量?第一版 【教學】如何用程式碼追蹤V
Thumbnail
使用顯性等待,以及讓我們的自動化網頁看起來有像測試的樣子 另外,readmoo電子書真的很方便啊
Thumbnail
使用顯性等待,以及讓我們的自動化網頁看起來有像測試的樣子 另外,readmoo電子書真的很方便啊
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News