第三章.vue.js-計算屬性(基礎(chǔ)篇)

模板內(nèi)的表達(dá)式常用于簡單的運(yùn)算,當(dāng)其過長或邏輯復(fù)雜時,會難以維護(hù),本章的計算屬性就是用于解決該問題的。

3.1-什么是計算屬性

在模板中進(jìn)行雙向綁定時,由于表達(dá)式過于復(fù)雜或過長,會變得臃腫甚至難以閱讀與維護(hù),比如:

<div>{{ text.split(',').reservse.join(',')}}</div>

這里的表達(dá)式包含三個操作,并不是很清晰,將上述計算屬性進(jìn)行改寫:

<div id="lmz">

??? {{reversedText}}

</div>

<script>

??? var lmz = new Vue({

??????? el:"#lmz",

??????? data:{

??????????? text:"123,456"

??????? },

??????? computed:{

??????? reversedText:function(){

????????? returnthis.text.split(',').reverse.join('.");

??????? }

??????? }

? })

</script>

所有的計算屬性都以函數(shù)的形式寫在Vue實例內(nèi)的computed選項內(nèi),最終返回計算后的結(jié)果。

3.2計算屬性用法

在一個計算屬性里可以完成各種復(fù)雜的邏輯,包括運(yùn)算、函數(shù)調(diào)用等,只要最終返回一個結(jié)果就可以,除了上述簡單的用法,計算屬性還可以依賴多個Vue實例的數(shù)據(jù),只要其中任一數(shù)據(jù)變化,計算屬性就會重新執(zhí)行,視圖也會更新。例如,下面的實例展示的是在購物車內(nèi)兩個包裹的物品總價:

<div id="lmz">

??? 總價::{{prices}}

</div>

<script>

var lmz =new Vue({

??? el:"#lmz",

??? data:{

? ? ? ? package1:[

???????????? {

????????????? name:"lmz",

????????????? price:888,

????????????? count:2

????????????? },

?????????? {

?????????????? name:"lgz",

????????????? price:666,

????????????? count1

????????????? },

??? ? ? package2:[

???????????? {

?????????????? name:"apple",

????????????? price:8888,

????????????? count:3

????????????? },

?????????? {

?????????????? name:"banana",

????????????? price:20

????????????? count:10

????????????? },

??????? ]

??? },

computed:{

???? prices:function(){

??????? var prices=0;

??????? for(var i =0;i<this.pakage1.length;i++){

???????? prices+=this.package1[i].price*this.package1[i].count;

??? }

??????? for(var i =0;i<this.pakage2.length;i++}(

???????? prices+=this.package2[i].price*this.package2[i].count;

??? }

return prices;

}

}

})

</script>

當(dāng)package1或package1中的商品有任何變化,比如購買商品數(shù)量變換或增刪商品時,計算屬性prices就會自動更新,視圖中的總價也會自動變化。

計算屬性還有兩個使用的小技巧容易被忽略:一是計算屬性可以依賴其它計算屬性。二是計算屬性不僅可以依賴當(dāng)前Vue實例的數(shù)據(jù),還可以依賴其它實例的數(shù)據(jù)。例如:

<div id="lmz1"><div>

<div id="lmz2">{{reversesText}}</div>

<script>

??? var lmz1 = new Vue({

????? el:"#lmz1",

??? data:{

?????? text:'123,456'

???? }

});

?? var lmz2 = new Vue({

??? el:"#lmz2",

??? computed:{

??? reversesText:function(){

?????? return lmz1.text.split(',').join(',');

????? }

??? }

})

</script>

解析:這里我們創(chuàng)建了兩個Vue實例lmz1和lmz2,在lmz2的計算屬性reversedText中,依賴的是lmz1中的數(shù)據(jù)text。這樣的用法在學(xué)習(xí)組件的時候會用到,尤其是多人協(xié)同開發(fā)時很常用,因為你寫的一個組件需要依賴他人的組件提供。

3.3計算屬性緩存

在上一節(jié)介紹指令與事件時,會發(fā)現(xiàn)調(diào)用methods里的方法也可以與計算屬性起到同樣的作用。

那么,既然使用menthods就可以實現(xiàn),為什么還需要計算屬性呢?

原因就是計算屬性是基于它的依賴緩存的,一個計算屬性所依賴的數(shù)據(jù)發(fā)生變化時,它才會重新取值,所以只有值不改變,計算屬性就不會更新。

使用計算屬性還是methods取決于是否需要緩存,當(dāng)便利大數(shù)組和做大量計算時,應(yīng)當(dāng)使用計算屬性。


上一章:vue.js-指令與事件(基礎(chǔ)篇)

下一章:vue.js、v-bind及class與style綁定(基礎(chǔ)篇)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,186評論 0 29
  • 摘要: {{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.s...
    柴東啊閱讀 618評論 0 1
  • vue.js是什么 是一套構(gòu)建用戶界面的漸進(jìn)式框架 vue應(yīng)用組成 一個 Vue 應(yīng)用由一個通過new Vue創(chuàng)建...
    多多醬_DuoDuo_閱讀 1,138評論 0 2
  • 第一次發(fā)現(xiàn)簡書,使在百度搜索資料的時候發(fā)現(xiàn)的,出于好奇和自己一直想寫東西,安靜地寫,不去管被誰看到,被誰評論,只是...
    東來東往0088閱讀 227評論 0 0
  • 其實那天我進(jìn)藥行純粹是個誤會,因為我和小童約好九點(diǎn)半在附近的天橋下見面。我來早了,無所事事,又不愿在街上呼吸灰塵和...
    樹先生V閱讀 365評論 0 1

友情鏈接更多精彩內(nèi)容