簡單的一些小計算可以直接用模板內的表達式計算,比較復雜一點的就建議使用“計算屬性來運算了”,也方便后期的維護;
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 計算屬性會立即返回之前的計算結果,而不必再次執行函數。
就拿第一個例子來說:
相對的,每當觸發重新渲染時,調用方法將總會再次執行函數。