目录
我们在项目开发过程中遇到需要进行计算的需求时,通过computed计算属性和methods方法均能实现,由此将带来一个问题,这两者的使用我们该如何选择?
一、computed 计算属性
1.1. 介绍
作用:封装了一段对于数据的处理,求得一个结果。
语法:
① 写在 computed 配置项中
② 作为属性,直接使用 → this.计算属性 {{ 计算属性 }}
缓存特性(提升性能):
计算属性会对计算出来的结果缓存,再次使用直接读取缓存;如果依赖项变化了,会自动重新计算 → 并再次缓存
1.2. 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
table {
border: 1px solid #000;
text-align: center;
width: 240px;
}
th,td {
border: 1px solid #000;
}
h3 {
position: relative;
}
</style>
</head>
<body>
<div id="app">
<h3>骑行队公路车品牌统计清单<span>{{ totalCount }}</span></h3>
<h3>骑行队公路车品牌统计清单<span>{{ totalCount }}</span></h3>
<table>
<tr>
<th>品牌系列名</th>
<th>数量</th>
</tr>
<tr v-for="(item, index) in list" :key="item.id">
<td>{{ item.name }}</td>
<td>{{ item.num }}辆</td>
</tr>
</table>
<!-- 目标:统计求和,求得公路车总数 -->
<p>公路车总数:{{ totalCount }} 个</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
// 现有的数据
list: [
{ id: 1, name: '崔克马东9', num: 6 },
{ id: 2, name: '闪电SL8', num: 2 },
{ id: 3, name: '梅花C68', num: 5 },
{ id: 4, name: 'Cervelo S5', num: 7 }
]
},
computed: {
totalCount () {
console.log('公路车总数统计')
// 基于现有的数据,编写求值逻辑
// 计算属性函数的内部可以直接通过this访问到app实例 this.list
// 需求:对 this.list数组里面的num进行求和(使用到reduce函数),其中sum为总和item为元素项0为起始总和赋值给sum
let total = this.list.reduce((sum, item) => sum + item.num, 0)
return total
}
}
})
</script>
</body>
</html>
1.3. 运行效果
我们可以看到,代码中我们进行了三次总数计算,但是控制台中计算的方法只执行了一次(只输出一条日志),这就是因为computed计算属性的缓存特性。

二、methods 方法
2.1. 介绍
作用:给实例提供一个方法,调用以处理业务逻辑。
语法:
① 写在 methods 配置项中
② 作为方法,需要调用 → this.方法名( ) {{ 方法名() }} @事件名="方法名"
不提供缓存的特性
2.2. 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
table {
border: 1px solid #000;
text-align: center;
width: 240px;
}
th,td {
border: 1px solid #000;
}
h3 {
position: relative;
}
</style>
</head>
<body>
<div id="app">
<h3>骑行队公路车品牌统计清单<span>{{ totalCountFn() }}</span></h3>
<h3>骑行队公路车品牌统计清单<span>{{ totalCountFn() }}</span></h3>
<table>
<tr>
<th>品牌系列名</th>
<th>数量</th>
</tr>
<tr v-for="(item, index) in list" :key="item.id">
<td>{{ item.name }}</td>
<td>{{ item.num }}辆</td>
</tr>
</table>
<!-- 目标:统计求和,求得公路车总数 -->
<p>公路车总数:{{ totalCountFn() }} 个</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
// 现有的数据
list: [
{ id: 1, name: '崔克马东9', num: 6 },
{ id: 2, name: '闪电SL8', num: 2 },
{ id: 3, name: '梅花C68', num: 5 },
{ id: 4, name: 'Cervelo S5', num: 7 }
]
},
methods: {
totalCountFn () {
console.log('公路车总数统计method')
let total = this.list.reduce((sum, item) => sum + item.num, 0)
return total
}
},
computed: {
totalCount () {
console.log('公路车总数统计')
// 基于现有的数据,编写求值逻辑
// 计算属性函数的内部可以直接通过this访问到app实例 this.list
// 需求:对 this.list数组里面的num进行求和(使用到reduce函数),其中sum为总和item为元素项0为起始总和赋值给sum
let total = this.list.reduce((sum, item) => sum + item.num, 0)
return total
}
}
})
</script>
</body>
</html>
2.3. 运行效果
我们可以看到,总数计算方法执行了三次,methods方法的执行不提供缓存的特性。
三、总结
computed计算属性更加侧重于处理数据、获取结果,而且它可以对结果进行缓存;methods方法更加侧重于提供业务逻辑。