vue – watch 和 computed 和 methods

vue – watch 和 computed 和 methods

watch 和 computed 和 methods 在vue 中,其實常常會用到。基本運用大家都知道,但三者之間,什麼場景,該用哪個?以及效能問題,在這邊我想記錄下來,分別做個比較和結論,來加深自己的印象。

一個最最基本例子來說,我想在畫面上打印出我的全名 Hsieh jessica,我們會這樣寫:

<template>
    <div class="main">
        <div> 我的名子: {{firstName}} - {{lastName}} </div>
    </div>
</template>
<script>
export default {
     data(){
        return{
             firstName: 'Hsieh',
             lastName:'jessica',  
        }
    },
}
</script>

我相信,這是小白都會用的做法,是一個很直覺的寫法。那我們來看一下 watch 怎麼寫

watch

<template>
     <div class="main">
         <div> 我的名子(使用 watch) : {{watchfullName}} </div>
     </div>
</template>

<script>
export default {
   data(){
        return{
            firstName: 'Hsieh',
            lastName:'jessica',
            watchfullName:'',
        }
    },
    watch:{
        firstName:{
            handler:function (newVal,oldVal) {
                this.watchfullName = newVal + ' ' + this.lastName;
            }, 
            immediate:true
        },
        lastName:{
            handler:function (newVal,oldVal) {
                this.watchfullName = this.firstName + ' ' + newVal;
            }, 
            immediate:true
        }
}
</script>

watch 的寫法,似乎就比較囉嗦,我們必須監聽 2個 data中的屬性 firstName 和 lastName,一但這2個值有改變,就會更動 data中 的 watchfullName,然後在顯示畫面上。

computed

<template>
    <div class="main">
        <div> 我的名子(使用 computed) : {{fullName}} </div>
     </div>
</template>

<script>
export default {
    data(){
        return{
            firstName: 'Hsieh',
            lastName:'jessica',
        }
    },
    computed:{
        fullName(){
            return  this.firstName +  this.lastName ;
        }
    }
}
</script>

挺直覺的,直接把data中的 firstName 和 lastName 運算完,並直接用fullName,顯示在畫面上。來看最後一個methods

methods

<template>
    <div class="main">
        <div> 我的名子(使用 methods) : {{allName(firstName,lastName)}} </div>
    </div>
</template>

<script>
export default {
    data(){
        return{
            firstName: 'Hsieh',
            lastName:'jessica',
        }
    },
    methods:{
        allName(firstName,lastName){
            return  firstName +  lastName;
        }
    },
}
</script>

寫了這三段,看起來沒毛病阿,都可以用阿,並且都達到我們要的效果 ! 是阿!但重點是我們要比較下結論壓~~

methods 和 computed 比較

當 computed 依賴於 data 的值沒改變時,是實上 computed 就不會被觸發。有緩存作用。

methods 不管是否有無依賴 data 中的值,都會一直被觸發。因此,效能會比 computed 低。

watch 和 computed 比較

基本上,此2者用起來差不多,但我們可以這樣想

如果監聽 多個 data 變數,產生 一個 結果 => 使用computed(常用於搜尋功能)

如果監聽 一個 data 變數,產生 多個 結果 => 使用 watch