computed、methods、watch

computed:計算屬性將被混入到 Vue 實例中。所有 getter 和 setter 的 this 上下文自動地綁定為 Vue 實例。
methods:methods 將被混入到 Vue 實例中。可以直接通過 VM 實例訪問這些方法,或者在指令表達式中使用。方法中的 this 自動綁定為 Vue 實例。
watch:是一種更通用的方式來觀察和響應 Vue 實例上的數據變動。一個對象,鍵是需要觀察的表達式,值是對應回調函數。值也可以是方法名,或者包含選項的對象。Vue 實例將會在實例化時調用 $watch(),遍歷 watch 對象的每一個屬性。

通俗來講,
1. computed是在HTML DOM加載后馬上執行的,如賦值;
2. methods則必須要有一定的觸發條件才能執行,如點擊事件;
3. watch它用于觀察Vue實例上的數據變動。對應一個對象,鍵是觀察表達式,值是對應回調。值也可以是方法名,或者是對象,包含選項。
所以他們的執行順序為:默認加載的時候先computed再watch,不執行methods;等觸發某一事件后,則是:先methods再watch。
  • computed稱為計算屬性,顧名思義,計算就要返回一個計算的結果,所以,當我們要處理大量的邏輯,但是最后要取得最后的結果的時候可以用computed。
 簡單示例: 要求: <input type="text v-model="num1"><input type="text v-model="num2"> 
   現在要返回num1和num2的和; <script>
    new Vue({
        el:"#box",
        data:{
                num1:0,
                num2:0
                }
        computed:{    
                result:function(){
                        return this.num1 + this.num2    
                        // 計算屬性必須有一個返回值
                }
        }
     })
</script>
  • methods:是方法的意思,在js中,我們把一些函數叫做方法,一般情況下,要觸發這個方法就要執行,要執行就要有一個源來觸發,所以就需要一個事件源,這是和computed的一點不同之處
methods的示例:
要求:
<button @click="do()">點擊彈出<\/button>
<script>
    new Vue({
        el:"#box",
        data:{
                num1:0,
                num2:0
                }
        methods:{    
                do:function(){
                      alert('ok')
                      //這里根據情況,可以返回有返回值也可以沒有返回值。
                }
        }
     })
</script>

對比computed 和 methods

  • computed計算的結果如果不發生改變就不會觸發result這個函數。而methods中一般都是定義的需要事件觸發的一些函數。每次只要觸發事件,就會執行對應的方法。
  • computed必須返回一個值頁面綁定的才能取得值,而methods中可以只執行邏輯代碼,可以有返回值,也可以沒有。
  • 如果把computed中的方法寫到method中會浪費性能。
<div id="example">  
  <p>Original message: "{{ message }}"</p>  
  <p>Computed reversed message: "{{ reversedMessage }}"</p>  
</div>

var vm = new Vue({  
  el: '#example',  
  data: {  
    message: 'Hello'  
  },  
  computed: {  
    reversedMessage: function () {  
      return this.message.split('').reverse().join('')  
    }  
  },
  methods: {  
    reverseMessage: function () {  
      return this.message.split('').reverse().join('')  
    }  
  } 
}) 
  • 計算屬性只有在它的相關依賴發生改變時才會重新取值。這就意味著只要 message 沒有發生改變,多次訪問 reversedMessage 計算屬性會立即返回之前的計算結果,而不必再次執行函數。也就是說只要不是直接使用瀏覽器刷新頁面,當我們改變數據、DOM操作等引起頁面重新渲染時,計算屬性會直接使用緩存,不會重新執行函數。適合那些計算量很大且改變頻率很低的屬性;
  • 如果使用methods,每次頁面重新渲染時都會重新執行methods函數。
  • 寫法上:computed計算屬性的方式在用屬性時不用加(),而methods方式在使用時要像方法一樣去用,必須加().
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容