Vue中的computed屬性稱為計算屬性。模板內(nèi)的表達(dá)式非常便利,但是設(shè)計它們的初衷是用于簡單運(yùn)算的麸折。在模板中放入太多的邏輯會讓模板過重且難以維護(hù)钠糊。
例如:
在這個地方挟秤,模板不再是簡單的聲明式邏輯。你必須看一段時間才能意識到抄伍,這里是想要顯示變量 message 的翻轉(zhuǎn)字符串艘刚。當(dāng)你想要在模板中多次引用此處的翻轉(zhuǎn)字符串時,就會更加難以處理截珍。
你可以使用computed屬性這么寫:
結(jié)果:
Original message: "Hello"
Computed reversed message: "olleH"
問:為什么reversedMessage不可以在data里面定義攀甚?
答:定義會報錯,因為computed作為計算屬性定義reversedMessage返回對應(yīng)的結(jié)果給這個變量(通俗的理解笛臣,reversedMessage只是監(jiān)控變量云稚,對message進(jìn)行處理,實際上重新返回了message)沈堡,變量不可以被重復(fù)定義和賦值静陈。
計算屬性只在第一次調(diào)用時執(zhí)行運(yùn)算過程,計算結(jié)果會被緩存在內(nèi)存中诞丽,多次調(diào)用時鲸拥,如果依賴的數(shù)據(jù)未發(fā)生變化,不會再去進(jìn)行運(yùn)算過程的執(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選項中設(shè)置的計算屬性——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ā)生改變怨咪,才會重新進(jìn)行計算;
不支持異步润匙,當(dāng)computed內(nèi)有異步操作時無效诗眨,無法監(jiān)聽數(shù)據(jù)的變化;
computed 屬性值會默認(rèn)走緩存趁桃,計算屬性是基于它們的響應(yīng)式依賴進(jìn)行緩存的辽话,也就是基于data中聲明過或者父組件傳遞的props中的數(shù)據(jù)通過計算得到的值
如果一個屬性是由其他屬性計算而來的,這個屬性依賴其他屬性卫病,是多對一或者一對一油啤,一般用computed
如果computed屬性屬性值是函數(shù),那么默認(rèn)會走get方法蟀苛;函數(shù)的返回值就是屬性的屬性值益咬;在computed中的,屬性都有一個get和一個set方法帜平,當(dāng)數(shù)據(jù)變化時幽告,調(diào)用set方法。