這篇文章主要介紹vue計算屬性的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
vue計算屬性:在【Vue.js 0.12.8】版本之前,只要讀取相應的計算屬性,對應的getter就會重新執行。而在【Vue.js 0.12.8】版本中,在這方面進行了優化,即只有計算屬性依賴的屬性值發生了改變時才會重新執行getter。
vue計算屬性:
一、計算屬性
計算屬性就是當其依賴屬性的值發生變化時,這個屬性的值會自動更新,與之相關的DOM部分也會同步自動更新。
代碼如下:
<div id="example">
<input type="text" v-model="didi">
<input type="text" v-model="family">
<br>
didi={{didi}},family={{family}},didiFamily={{didiFamily}}
</div>
var vm = new Vue({
el:'#example',
data:{
didi:'didi',
family:'family'
},
computed:{
<!-- 一個計算屬性的getter -->
didiFamily:function(){
<!-- this指向vm實例 -->
return this.didi+this.family
}
}
})當vm.didi和vm.family的值發生變化時,vm.didiFamily的值會自動更新,并且會自動同步更新DOM部分。
前面實例只提供了getter,實際上除了getter。我們還可以設置計算屬性的setter。代碼示例如下:
<div id="example">
<input type="text" v-model="didi">
<input type="text" v-model="family">
<br>
didi={{didi}},family={{family}},didiFamily={{didiFamily}}
</div>
var vm = new Vue({
el:'#example',
data:{
didi:'didi',
family:'family'
},
computed:{
<!-- 一個計算屬性的getter -->
didiFamily:function(){
get:function(){
<!-- this指向vm實例 -->
return this.didi+this.family
},
<!-- 一個計算屬性的setter -->
set:function(newVal){
var names = newVal.split('')
this.didi = names[0]
this.didi = names[1]
}
}
}
})當設置vm.didiFamily的值時,vm.didi和vm.family的值也會自動更新。
二、計算屬性緩存
計算屬性的特性的確很誘人,但是如果在計算屬性方法中執行大量的耗時操作,則可能會帶來一些性能問題。例如,在計算屬性getter中循環一個大的數組以執行很多操作,那么當頻繁調用該計算屬性時,就會導致大量不必要的運算。
在Vue.js 0.12.8版本之前,只要讀取相應的計算屬性,對應的getter就會重新執行。而在Vue.js 0.12.8版本中,在這方面進行了優化,即只有計算屬性依賴的屬性值發生了改變時才會重新執行getter。
這樣也存在一個問題,就是只有Vue實例中被觀察的數據屬性發生了改變時才會重新執行getter。但是有時候計算屬性依賴實時3的非觀察數據屬性。代碼示例如下:
var vm = new Vue({
data:{
welcome:'welcome to join didiFamily'
},
computed:{
example:function(){
return Date.now() + this.welcome
}
}
})我們需要在每次訪問example時都取得最新的時間而不是緩存的時間。從Vue.js 0.12.11版本開始,默認提供了緩存開關,在計算屬性對象中指定cache字段來控制是否開啟緩存。代碼示例如下:
var vm = new Vue({
data:{
welcome:'welcome to join didiFamily'
},
computed:{
example:function(){
//關閉緩存,默認為true
cache:false,
get:function(){
return Date.now() + this.welcome
}
}
}
})設置cache為false關閉緩存之后,每次直接訪問vm.example時都會重新執行getter方法。
三、常見問題
在實際開發中使用計算屬性時,我們會遇到各種各樣的問題,以下是搜集到的一些常見問題以及解決方案。
計算屬性getter不執行的場景
從前面我們了解到,當計算屬性依賴的數據屬性發生改變時,計算屬性的getter方法就會執行。但是在有些情況下,雖然依賴數據屬性發生了改變,但計算屬性的getter方法并不會執行。但是在有些情況下,雖然依賴數據屬性發生了改變,但計算屬性的getter方法并不會執行。
當包含計算屬性的節點被移除并且模板中其他地方沒有再引用該屬性時,那么對應的計算屬性的getter方法不會執行。代碼示例如下:
<div id="example">
<button @click='toggleShow'>Toggle Show Total Price</button>
<p v-if="showTotal">Total Price = {{totalPrice}}</p>
</div>
new Vue({
el:'#example',
data:{
showTotal:true,
basePrice:100
},
computed:{
totalPrice:function(){
return this.basePrice + 1
}
},
methods:{
toggleShow:function(){
this.showTotal = !this.showTotal
}
}
})當點擊按鈕使showTotal為false,此時P元素會被移除,在P元素內部的計算屬性totalPrice的getter方法不會執行。但是當計算屬性一直出現在模板中時,getter方法還是會被執行
2.在v-repeat中使用計算屬性
有時候從后端獲得JSON數據集合后,我們需要對單條數據應用計算屬性。在Vue.js 0.12之前的版本中,我們可以在v-repeat所在元素上使用v-component指令。代碼示例如下:
<div id="items">
<p v-repeat="items" vue-component="item">
<button>{{fulltext}}</button>
</p>
</div>
var items = [
{number:1,text:'one'},
{number:2,text:'two'}
]
var vue = new Vue({
el:'#items',
data:{
items:items
},
components:{
item:{
computed:{
fulltext:function(){
return 'item' +this.text
}
},
}
}
})在Vue.js 0.12版本中,Vue.js廢棄了v-component指令,所以我們需要使用自定義元素組件來實現在v-repeat中使用計算屬性。代碼示例如下:
<div id="items">
<my-item v-repeat="items" inline-template>
</my-item>
</div>
var items = [
{number:1,text:'one'},
{number:2,text:'two'}
]
var vue = new Vue({
el:'#items',
data:{
items:items
},
components:{
'my-item':{
replace:true,
computed:{
fulltext:function(){
return 'item' +this.text
}
},
}
}
})以上是“vue計算屬性的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。