[VUE] 利用 key 做到 props 的特定資料更新就重新 mount
Jan 16, 2025
有一個需求是:每次 mount 和 props 的特定資料有更新時,都要執行 function doSomething()
。
首先想到的是在子元件使用 onMounted()
同時也使用 watch()
監控 props 的特定資料。
但除了這個方法,還可以利用在父元件傳 :key
,就不用寫 watch()
了。
這邊示範兩種方式的做法。
在子元件使用 watch 監控
- 用 watch 監控 props 來的資料,有監控到變化就執行
doSomething()
。 - 在
onMounted()
放入doSomething()
。
就可以做到 onMounted()
會執行,同時 props 來的特定資料有更新時也會執行。
ParentComponent:
<ChildComponent
:id="dataId"
/>
ChildComponent:
const props = defineProps<{
id: string
}>();
function doSomething() {}
watch(() => props.id, () => {
doSomething();
});
onMounted(() => {
doSomething();
});
在父元件使用 key 的做法範例
ParentComponent:
<ChildComponent
:id="dataId"
:key="dataId"
/>
ChildComponent:
const props = defineProps<{
id: string
}>();
function doSomething() {}
onMounted(() => {
doSomething();
});
- 在父元件的
:key
放入每次有更新都要執行doSomething()
的特定 props 資料。 onMounted()
一樣放入doSomething()
。
這樣只要每次 dataId
有更新,都會因為 :key
偵測到改變而重新 mount 一個新的子元件 <ChildComponent>
,因此就會執行到 onMounted()
裡面的 doSomething()
。
就可以達到 onMounted()
會執行,同時 props 來的特定資料有更新時也會執行了!
這個方法適用於子元件「onMounted 要做的事」和「父元件 props 資料有更新時要做的事」完全相同的情境。
後續思考
這個做法的缺點,就是只看子元件的話看不出父層 props 的資料改變會呼叫 doSomething()
,會以為只有 onMounted()
有呼叫到 doSomething()
。
不過這個例子可以讓我們了解能透過 :key
來重新 mount 子元件。