Vue計算屬性computed與方法methods的區(qū)別及說明
前言
在官方文檔中,給出了計算屬性的說明與用途,也講述了計算屬性與方法的區(qū)別點。
本篇博客只做自己的探究記錄,以官方文檔為準。
計算屬性的由來
正常來說,使用模板語法也能實現(xiàn)一些判斷操作,并將判斷后的數(shù)據(jù)值進行展示。
如下:
<template>
<h1>計算屬性與方法實現(xiàn)探究</h1>
<p>Has published books:</p>
<span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>
</template>
<script>
export default {
data(){
return{
author: {
name: 'John Doe',
books: [
'Vue 2 - Advanced Guide',
'Vue 3 - Basic Guide',
'Vue 4 - The Mystery'
]
}
}
}
}
</script>
效果展示如下所示:

但正常開發(fā)來說,在模板語法中,只會用來做基本的數(shù)據(jù)展示,數(shù)據(jù)的處理需要使用放入計算屬性 computed中進行實現(xiàn)。
如下所示:
<template>
<h1>計算屬性與方法實現(xiàn)探究</h1>
<p>Has published books:</p>
<span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>
<hr>
<span>計算屬性:{{ checkBooks }}</span> <br>
</template>
<script>
export default {
data(){
return{
author: {
name: 'John Doe',
books: [
'Vue 2 - Advanced Guide',
'Vue 3 - Basic Guide',
'Vue 4 - The Mystery'
]
}
}
},
computed:{
checkBooks(){
console.log("=====計算屬性=====");
return this.author.books.length > 0 ? 'Yes' : 'No';
}
}
}
</script>

由于計算屬性,屬于屬性,所以在標簽中采取{{ }}包含時,不能帶有()。
方法實現(xiàn) 計算屬性 同樣的效果
由于methods中,用來存放函數(shù)、方法,所以在計算屬性computed中的方法依舊可以用methods實現(xiàn)。
如下所示:
<template>
<h1>計算屬性與方法實現(xiàn)探究</h1>
<p>Has published books:</p>
<span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>
<hr>
<span>計算屬性:{{ checkBooks }}</span> <br>
<hr>
<span>方法實現(xiàn):{{ checkBooks1() }}</span> <br>
</template>
<script>
export default {
data(){
return{
author: {
name: 'John Doe',
books: [
'Vue 2 - Advanced Guide',
'Vue 3 - Basic Guide',
'Vue 4 - The Mystery'
]
}
}
},
computed:{
checkBooks(){
console.log("=====計算屬性=====");
return this.author.books.length > 0 ? 'Yes' : 'No';
}
},
// methods 中存放函數(shù)
methods:{
checkBooks1(){
console.log("*****方法實現(xiàn)*****");
return this.author.books.length > 0 ? 'Yes' : 'No';
}
}
}
</script>

由于是采取methods進行數(shù)據(jù)的計算,所以數(shù)據(jù)的展示,需要使用()標識調(diào)用方法。
【注意】計算屬性與方法,名稱不能相同,否則會出現(xiàn)報錯!

計算屬性緩存 vs 方法
雖然在methods中編寫一個方法調(diào)用,與計算屬性中拋出一個計算結(jié)果值,能達到一樣的效果。
但兩者本身有很大的區(qū)別。
不同之處在于計算屬性值會基于其響應式依賴被緩存。
這句話如何理解呢,看下面的案例:
<template>
<h1>計算屬性與方法實現(xiàn)探究</h1>
<p>Has published books:</p>
<span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>
<hr>
<span>計算屬性:{{ checkBooks }}</span> <br>
<span>計算屬性:{{ checkBooks }}</span> <br>
<span>計算屬性:{{ checkBooks }}</span> <br>
<span>計算屬性:{{ checkBooks }}</span> <br>
<hr>
<span>方法實現(xiàn):{{ checkBooks1() }}</span> <br>
<span>方法實現(xiàn):{{ checkBooks1() }}</span> <br>
<span>方法實現(xiàn):{{ checkBooks1() }}</span> <br>
<span>方法實現(xiàn):{{ checkBooks1() }}</span> <br>
</template>
<script>
export default {
data(){
return{
author: {
name: 'John Doe',
books: [
'Vue 2 - Advanced Guide',
'Vue 3 - Basic Guide',
'Vue 4 - The Mystery'
]
}
}
},
computed:{
checkBooks(){
console.log("=====計算屬性=====");
return this.author.books.length > 0 ? 'Yes' : 'No';
}
},
// methods 中存放函數(shù)
methods:{
checkBooks1(){
console.log("*****方法實現(xiàn)*****");
return this.author.books.length > 0 ? 'Yes' : 'No';
}
}
}
</script>
查看瀏覽器控制臺中的打印信息:

【發(fā)現(xiàn)】
當初始數(shù)組中的數(shù)據(jù)并未變化的時候,如果采取計算屬性,在第一次做調(diào)用處理,并將第一次計算的結(jié)果值做緩存;后面多次重復調(diào)用,直接讀取的是緩存中的數(shù)據(jù)值,而不是重復計算。
但方法中,每次的調(diào)用都會重新執(zhí)行一次計算邏輯。
相比之下,方法調(diào)用總是會在重渲染發(fā)生時再次執(zhí)行函數(shù)。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue export import 導入導出的多種方式與區(qū)別介紹
這篇文章主要介紹了Vue export import 導入導出的多種方式與區(qū)別介紹,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
vue實現(xiàn)echart餅圖legend顯示百分比的方法
本文主要介紹了vue實現(xiàn)echart餅圖legend顯示百分比的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09

