vue之計(jì)算屬性的緩存computed的用法解讀
vue計(jì)算屬性的緩存computed用法
計(jì)算屬性的緩存
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <!--1.直接拼接:語(yǔ)法過(guò)于繁瑣--> <h2>{{firstName}} {{lastName}}</h2> <!--2.通過(guò)定義methods--> <h2>{{getFullName()}}</h2> <!--3.通過(guò)computed--> <h2>{{fullName}}</h2> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { firstName: 'Kobe', lastName: 'Bryant' }, methods: { getFullName: function () { return this.firstName+' '+this.lastName } }, computed: { fullName: function () { return this.firstName+' '+this.lastName } } }) </script> </body> </html>
在多次循環(huán)使用時(shí),methods時(shí)會(huì)多次調(diào)用,而computed只調(diào)用一次
computed計(jì)算屬性設(shè)置與緩存問(wèn)題
簡(jiǎn)單的一些小計(jì)算可以直接用模板內(nèi)的表達(dá)式計(jì)算,比較復(fù)雜一點(diǎn)的就建議使用“計(jì)算屬性來(lái)運(yùn)算了”,也方便后期的維護(hù);
vue所有的計(jì)算屬性都以函數(shù)的形式寫(xiě)在Vue實(shí)例內(nèi)的computed里面,返回計(jì)算后的數(shù)據(jù)。
- 計(jì)算屬性可以同時(shí)按多個(gè)Vue實(shí)例來(lái)計(jì)算,只要其中任何一個(gè)數(shù)據(jù)發(fā)生變化,
- 計(jì)算屬性就會(huì)重新計(jì)算一遍,返回新的數(shù)據(jù),相對(duì)的刷新視圖中的數(shù)據(jù)
比如:
<div id="v1"> <!--這里顯示的是computed中的函數(shù)--> 共計(jì):{{ 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>
每個(gè)計(jì)算屬性都有一個(gè)getter函數(shù) 和 setter函數(shù),上面的示例只是用了computed的唯一默認(rèn)屬性,就是getter , setter一般用來(lái)手動(dòng)修改數(shù)據(jù)
<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讀取數(shù)據(jù) return this.first + " ~ " + this.second + " ~ " + this.third }, set:function (val) { //setter 需要時(shí)觸發(fā) var result=val.split(" ~ "); this.first=result[0]; this.third=result[2]; } } } }); app.value="John ~ love ~ Sherlock"; //在這里觸發(fā)setter </script>
另外,計(jì)算屬性不僅可以通過(guò)當(dāng)前的當(dāng)前的實(shí)例數(shù)據(jù)計(jì)算,也可以做到 “跨實(shí)例” 取值,用法如下:
<script> var v1=new Vue({ el:"#v1", data:{ num:1 } }); var v2=new Vue({ el:"#v2", data:{ num:2 }, computed:{ total:function () { var n1="我是上一個(gè)實(shí)例的數(shù)據(jù) :"+v1.num, n2="我是本實(shí)例的數(shù)據(jù):"+this.num; return n1 +" ............. " +n2; } } }) </script>
頁(yè)面顯示:
對(duì)于computed計(jì)算屬性來(lái)說(shuō)還有一個(gè)很重要的作用就是:緩存
一般情況下,computed(計(jì)算屬性) 和 methods(方法)執(zhí)行出來(lái)的效果是一樣的,
但是computed的好處是:
只有在與它相關(guān)或者需要的數(shù)據(jù)發(fā)生改變時(shí)才會(huì)重新求值。
這就意味著只要 我們?cè)谟?jì)算時(shí)設(shè)置的數(shù)據(jù)還沒(méi)有發(fā)生改變,即使多次訪問(wèn) reversedMessage 計(jì)算屬性會(huì)立即返回之前的計(jì)算結(jié)果,而不必再次執(zhí)行函數(shù)。
就拿第一個(gè)例子來(lái)說(shuō):
相對(duì)的,每當(dāng)觸發(fā)重新渲染時(shí),調(diào)用方法將總會(huì)再次執(zhí)行函數(shù)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue+jsPlumb實(shí)現(xiàn)連線效果(支持滑動(dòng)連線和點(diǎn)擊連線)
jsPlumb 是一個(gè)比較強(qiáng)大的繪圖組件,它提供了一種方法,主要用于連接網(wǎng)頁(yè)上的元素。本文將利用jsPlumb實(shí)現(xiàn)連線效果,同時(shí)支持滑動(dòng)連線和點(diǎn)擊連線,感興趣的可以了解一下2023-01-01vue自定義指令實(shí)現(xiàn)元素滑動(dòng)移動(dòng)端適配及邊界處理
這篇文章主要為大家介紹了vue自定義指令實(shí)現(xiàn)元素滑動(dòng)移動(dòng)端適配及邊界處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09vue使用echarts實(shí)現(xiàn)中國(guó)地圖和點(diǎn)擊省份進(jìn)行查看功能
這篇文章主要介紹了vue使用echarts實(shí)現(xiàn)中國(guó)地圖和點(diǎn)擊省份進(jìn)行查看功能,本文通過(guò)實(shí)例代碼給大家詳細(xì)講解,對(duì)vue echarts 中國(guó)地圖相關(guān)知識(shí)感興趣的朋友一起看看吧2022-12-12