iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
自我挑戰組

從零開始Vuejs系列 第 23

[Day23] 監聽器Watch

  • 分享至 

  • xImage
  •  

今天是第二十三天,我想簡單分享一下Watch

watch需要對一個對象(資料等)進行監聽,當資料狀態有發生變化便會執行的函數,
可以用來進行跟資料變化有關的處理。


值的種類:
1. 若是監聽 ref 的值,那就直接監聽該值即可
2. 若是監聽 ref 物件的值,那要針對其中的資料,並將之改成 getter 可讀取的值,
也就是 () => refObj.value.idx 這種方式
3. 若是監聽 ref 整個物件,那要加入第三個參數來做深層監控,也就是 {deep: true} 才行,
無法取得舊值
4. 若是監聽 reactive 物件的值,那要針對其中的資料,並將之改成 getter 可讀取的值,
也就是 () => reactiveObj.idx 這種方式
5. 若是監聽 reactive 整個物件,無法取得舊值

更深入可以參考這篇文章:
https://campus-xoops.tn.edu.tw/modules/tad_book3/page.php?tbsn=33&tbdsn=1729


我們可以使用Options API,使得watch的監聽對象發生變化時觸發函數

我們可以參考官網提供的程式碼進行改寫:

這裡是HTML的部分

<div id="app">
    <p>
        try to enter "george"
        <br>
        <input v-model="name" />
        <hr>
    </p>
    <p>{{ answer }}</p>
    <p>{{res}}</p>
</div>

這裡是JS的部分

<script>
    const {  ref , reactive , watch } = Vue;
    const app={  
    data() {
        return {
            name: '',
            answer: 'enter "george" you will know what is his favorite fruit'
            }
        },
    watch: {
        name(newname, oldname) {
            if (newname.indexOf('george') > -1) {
                this.getAnswer()
            }
        }
    },
    methods: {
        async getAnswer() {
            this.answer = 'Thinking...'
            try {
                this.answer = "george最喜歡奇異果"
                } catch (error) {
                this.answer = 'Error! Could not reach the API. ' + error
                }
            }
        }
    }
    const myVue = Vue.createApp(app).mount("#app");  
</script>

在程式碼中,只要把"george"輸入在watch監聽的v-model中,函數便會執行,
並且顯示methods裡面的 "george最喜歡奇異果"

輸入前
https://ithelp.ithome.com.tw/upload/images/20221005/20151006nEropTGKWA.png
輸入後
https://ithelp.ithome.com.tw/upload/images/20221005/201510062RerxhtAMy.png

參考資料:
https://vuejs.org/guide/essentials/watchers.html

監聽器Watch就分享到這邊,我們第二十四天見


上一篇
[Day22] 計算屬性Computed
下一篇
[Day24] 組件基礎(一)
系列文
從零開始Vuejs30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言