簡單的一些小計算可以直接用模板內的表達式計算,比較復雜一點的就建議使用“計算屬性來運算了”,也方便后期的維護;
vue所有的計算屬性都以函數的形式寫在Vue實例內的computed里面,返回計算后的數據。
計算屬性可以同時按多個Vue實例來計算,只要其中任何一個數據發生變化,
計算屬性就會重新計算一遍,返回新的數據,相對的刷新視圖中的數據
比如:
<div id="v1">
<!--這里顯示的是computed中的函數-->
共計:{{ total }}
</div>
<script src="vue.min.js"></script>
<script>
var app=new Vue({
el:"#v1",
data:{
val:[
{ price: 199,num:30},
{ price: 299,num:20},
{ price: 399,num:10}
]
},
computed:{
total:function () {
var vel=this.val;
var sum=0,len=vel.length;
for(var i=0;i<len;i++){
sum+=vel[i].price * vel[i].num
}
return sum;
}
}
})
</script>

每個計算屬性都有一個getter函數 和 setter函數,上面的示例只是用了computed的唯一默認屬性,就是getter , setter一般用來手動修改數據
<div id="v1"> {{ value }} </div> <script src="vue.min.js"></script> <script> var app=new Vue({ el:"#v1", data:{ first:"Sherlock", second:"love", third:"John" }, computed:{ value: { get:function () { //getter讀取數據 return this.first + " ~ " + this.second + " ~ " + this.third }, set:function (val) { //setter 需要時觸發 var result=val.split(" ~ "); this.first=result[0]; this.third=result[2]; } } } }); app.value="John ~ love ~ Sherlock"; //在這里觸發setter </script>
另外,計算屬性不僅可以通過當前的當前的實例數據計算,也可以做到 “跨實例” 取值,用法如下:
<script>
var v1=new Vue({
el:"#v1",
data:{
num:1
}
});
var v2=new Vue({
el:"#v2",
data:{
num:2
},
computed:{
total:function () {
var n1="我是上一個實例的數據 :"+v1.num,
n2="我是本實例的數據:"+this.num;
return n1 +" ............. " +n2;
}
}
})
</script>
頁面顯示:


對於computed計算屬性來說還有一個很重要的作用就是:緩存
一般情況下,computed(計算屬性) 和 methods(方法)執行出來的效果是一樣的,
但是computed的好處是:
只有在與它相關或者需要的數據發生改變時才會重新求值。
這就意味着只要 我們在計算時設置的數據還沒有發生改變,即使多次訪問 reversedMessage 計算屬性會立即返回之前的計算結果,而不必再次執行函數。
就拿第一個例子來說:

相對的,每當觸發重新渲染時,調用方法將總會再次執行函數。
