Vue中的computed屬性稱為計算屬性。模板內(nèi)的表達式非常便利,但是設計它們的初衷是用于簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護。
例如:

在這個地方,模板不再是簡單的聲明式邏輯。你必須看一段時間才能意識到,這里是想要顯示變量 message 的翻轉(zhuǎn)字符串。當你想要在模板中多次引用此處的翻轉(zhuǎn)字符串時,就會更加難以處理。
你可以使用computed屬性這么寫:


結(jié)果:
Original message: "Hello"
Computed reversed message: "olleH"
問:為什么reversedMessage不可以在data里面定義?
答:定義會報錯,因為computed作為計算屬性定義reversedMessage返回對應的結(jié)果給這個變量(通俗的理解,reversedMessage只是監(jiān)控變量,對message進行處理,實際上重新返回了message),變量不可以被重復定義和賦值。
計算屬性只在第一次調(diào)用時執(zhí)行運算過程,計算結(jié)果會被緩存在內(nèi)存中,多次調(diào)用時,如果依賴的數(shù)據(jù)未發(fā)生變化,不會再去進行運算過程的執(zhí)行。
畫重點:computed依賴于data中的數(shù)據(jù),只有在它的相關(guān)依賴數(shù)據(jù)發(fā)生改變時才會重新求值。我理解為,computed只能監(jiān)控放在data等對象下的實例數(shù)據(jù)。
看下面的例子:
?<button?@click="getMethodsDate">methods</button>
?<button?@click="getComputedDate">computed</button>
??computed:?{
????computedDate()?{
??????return?new?Date();
????}
??},
????getMethodsDate()?{
??????alert(new?Date());
????},
????//?返回computed選項中設置的計算屬性——computedDate
????getComputedDate()?{
??????alert(this.computedDate);
????},
多次點擊computed按鈕,返回的時間是相同的!每次點擊methods按鈕返回的時間是不同的。
原因正是computed依賴于data中的數(shù)據(jù),new Date()不是依賴型數(shù)據(jù)(不是放在data等對象下的實例數(shù)據(jù)),所以computed只提供了緩存的值,而沒有重新計算。
只有符合:1.存在依賴型數(shù)據(jù) 2.依賴型數(shù)據(jù)發(fā)生改變這兩個條件,computed才會重新計算。
總結(jié):
支持緩存,只有依賴數(shù)據(jù)發(fā)生改變,才會重新進行計算;
不支持異步,當computed內(nèi)有異步操作時無效,無法監(jiān)聽數(shù)據(jù)的變化;
computed 屬性值會默認走緩存,計算屬性是基于它們的響應式依賴進行緩存的,也就是基于data中聲明過或者父組件傳遞的props中的數(shù)據(jù)通過計算得到的值
如果一個屬性是由其他屬性計算而來的,這個屬性依賴其他屬性,是多對一或者一對一,一般用computed
如果computed屬性屬性值是函數(shù),那么默認會走get方法;函數(shù)的返回值就是屬性的屬性值;在computed中的,屬性都有一個get和一個set方法,當數(shù)據(jù)變化時,調(diào)用set方法。