天天看點

Vue中的計算屬性緩存 vs 方法

你可能已經注意到我們可以通過在表達式中調用方法來達到同樣的效果:

<p>Reversed message: "{{ reversedMessage() }}"</p>
           
// 在元件中
methods: {
  reversedMessage: function () {
    return this.message.split('').reverse().join('')
  }
}
           

我們可以将同一函數定義為一個方法而不是一個計算屬性。兩種方式的最終結果确實是完全相同的。

然而,不同的是計算屬性是基于它們的依賴進行緩存的。隻在相關依賴發生改變時它們才會重新求值。

這就意味着隻要 

message

 還沒有發生改變,多次通路 

reversedMessage

 計算屬性會立即傳回之前的計算結果,而不必再次執行函數。

這也同樣意味着下面的計算屬性将不再更新,因為 

Date.now()

 不是響應式依賴:

computed: {
  now: function () {
    return Date.now()
  }
}
           

相比之下,每當觸發重新渲染時,調用方法将總會再次執行函數。

我們為什麼需要緩存?假設我們有一個性能開銷比較大的計算屬性 A,它需要周遊一個巨大的數組并做大量的計算。然後我們可能有其他的計算屬性依賴于 A 。如果沒有緩存,我們将不可避免的多次執行 A 的 getter!如果你不希望有緩存,請用方法來替代。

來源于:

https://cn.vuejs.org/v2/guide/computed.html#計算屬性-vs-偵聽屬性