如果 Watch 在 composition API 要怎麼使用呢?我們一起來看看。

這裡有個搜尋框範例,輸入 searchInput 文字後,API 會回傳事件數量 results

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<template>
<div>
Search for <input v-model="searchInput" />
<div>
<p>Number of events: {{ results }}</p>
</div>
</div>
</template>
<script>
import { ref } from "vue";
import eventApi from "@/api/event.js";

export default {
setup() {
const searchInput = ref("");
const results = ref(0);

results.value = eventApi.getEventCount(searchInput.value);

return { searchInput, results };
}
};
</script>

如果用上面的寫法,會發現不管輸入任何東西進去 searchInput,results 的值都沒變。這是因為 getEventCount 目前只會觸發在一開始 setup 的函式,只會執行一次,後續並不會被觸發。所以,如果我們把它改成放在 watch event 裡面,就會監聽 reactive 值的改變去抓新的值,如下。

1
2
3
4
5
6
7
8
9
10
setup() {
const searchInput = ref("");
const results = ref(0);

watchEffect(() => {
results.value = eventApi.getEventCount(searchInput.value);
});

return { searchInput, results };
}

如此一來,只要 reactive 的值改變,就會觸發並重新 rendor 畫面。但如果要指定只要監聽 searchInput 的話,可以改寫如下。其中 newVal, oldVal 參數可以比較值的前後改變。

1
2
3
watch(searchInput, (newVal, oldVal) => {
...
});

如果要 watch 指定多個 reactive,可以寫成陣列如下。

1
2
3
watch([firstName, lastName], ([newFirst, newLast], [oldFirst, oldLast]) => {
...
});

參考資料