Vue 計(jì)算屬性 computed
前言:
一般情況下屬性都是放到data中的,但是有些屬性可能是需要經(jīng)過一些邏輯計(jì)算后才能得出來,那么我們可以把這類屬性變成計(jì)算屬性。
比如以下:
<div id="example">
{{ message.split('').reverse().join('') }}
</div>
在這個地方,模板不再是簡單的聲明式邏輯。你必須看一段時間才能意識到,這里是想要顯示變量 message 的翻轉(zhuǎn)字符串。當(dāng)你想要在模板中的多處包含此翻轉(zhuǎn)字符串時,就會更加難以處理。
所以,對于任何復(fù)雜邏輯,你都應(yīng)當(dāng)使用計(jì)算屬性。
1、基礎(chǔ)例子
<div id="app">
<h2>總價格:{{totalPrice}}</h2>
</div>
<script>
const vm = new Vue({
el: "#app",
data: {
message: "hello",
books: [
{name: '三國演義', price: 30},
{name: '紅樓夢', price: 40},
{name: '西游記', price: 50},
{name: '水滸傳', price: 60},
],
},
computed: {
// 計(jì)算屬性的 getter
totalPrice: function (){
let result = 0;
// `this` 指向 vm 實(shí)例
for (let book of this.books){
result += book.price;
}
return result
}
}
})
</script>
結(jié)果:總價格:180
這里我們聲明了一個計(jì)算屬性 totalPrice。然后通過for循環(huán)計(jì)算出書的總價,像這種需要計(jì)算的屬性,就寫在computed中。
屬性一般都有get和set兩個方法,get獲取屬性值,set設(shè)置屬性值,computed中默認(rèn)就是get屬性,我們的vm.totalPrice是依賴于books.price,如果書本的價格發(fā)生變化,那么計(jì)算屬性totalPrice也隨之動態(tài)變化
2、計(jì)算屬性緩存 vs 方法
你可能已經(jīng)注意到我們可以通過在表達(dá)式中調(diào)用方法來達(dá)到同樣的效果:
<div id="app">
<h2>總價格:{{getAllPrice()}}</h2>
</div>
<script>
const vm = new Vue({
el: "#app",
data: {
message: "hello",
books: [
{name: '三國演義', price: 30},
{name: '紅樓夢', price: 40},
{name: '西游記', price: 50},
{name: '水滸傳', price: 60},
],
},
methods: {
getAllPrice: function () {
let result = 0;
// `this` 指向 vm 實(shí)例
for (let book of this.books){
result += book.price;
}
return result
}
},
})
</script>
我們可以將同一函數(shù)定義為一個方法而不是一個計(jì)算屬性。兩種方式的最終結(jié)果確實(shí)是完全相同的。然而,不同的是計(jì)算屬性是基于它們的響應(yīng)式依賴進(jìn)行緩存的。只在相關(guān)響應(yīng)式依賴發(fā)生改變時它們才會重新求值。這就意味著只要 books 還沒有發(fā)生改變,多次訪問 totalPrice 計(jì)算屬性會立即返回之前的計(jì)算結(jié)果,而不必再次執(zhí)行函數(shù)。
所以說計(jì)算屬性是有緩存的
我們?yōu)槭裁葱枰彺??假設(shè)我們有一個性能開銷比較大的計(jì)算屬性 A,它需要遍歷一個巨大的數(shù)組并做大量的計(jì)算。然后我們可能有其他的計(jì)算屬性依賴于 A。如果沒有緩存,我們將不可避免的多次執(zhí)行 A 的 getter!如果你不希望有緩存,請用方法來替代。
3、計(jì)算屬性的 setter
計(jì)算屬性默認(rèn)只有 getter,不過在需要時你也可以提供一個 setter:
computed: {
totalPrice: {
get: function () {
let result = 0;
// `this` 指向 vm 實(shí)例
for (let book of this.books){
result += book.price;
}
return result
},
set: function (newValue) {
for (let book of this.books){
book.price += 10
}
}
}
}
這里我們添加了set方法,在運(yùn)行vm.totalPrice=[...]時,setter 會被調(diào)用,隨后書本的總價格也會隨之變化,但是一般情況下不會使用set
到此這篇關(guān)于Vue 計(jì)算屬性 computed的文章就介紹到這了,更多相關(guān)Vue computed內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue+echarts實(shí)現(xiàn)條紋柱狀橫向圖
這篇文章主要為大家詳細(xì)介紹了vue+echarts實(shí)現(xiàn)條紋柱狀橫向圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
element-ui 關(guān)于獲取select 的label值方法
今天小編就為大家分享一篇element-ui 關(guān)于獲取select 的label值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
vue elementui el-table 表格里邊展示四分位圖效果(功能實(shí)現(xiàn))
這篇文章主要介紹了vue elementui el-table 表格里邊展示四分位圖效果(功能實(shí)現(xiàn)),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-04-04
Vue項(xiàng)目如何保持用戶登錄狀態(tài)(localStorage+vuex刷新頁面后狀態(tài)依然保持)
關(guān)于vue登錄注冊,并保持登錄狀態(tài),是vue玩家必經(jīng)之路,這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目如何保持用戶登錄狀態(tài)的相關(guān)資料,localStorage+vuex刷新頁面后狀態(tài)依然保持,需要的朋友可以參考下2022-05-05
vue項(xiàng)目中做編輯功能傳遞數(shù)據(jù)時遇到問題的解決方法
這篇文章主要介紹了vue項(xiàng)目中做編輯功能傳遞數(shù)據(jù)時遇到問題的解決方法,vue父組件向子組件傳遞數(shù)據(jù)的問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
vue3實(shí)現(xiàn)小程序手機(jī)號一鍵登錄功能
這篇文章主要為大家詳細(xì)介紹了如何使用vue3實(shí)現(xiàn)小程序手機(jī)號一鍵登錄功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12

