计算属性computed:侧重于计算,并且是有缓存的,会将结果保存起来,下次调用会直接使用结果。由于计算属性的缓存特性,可以提升性能。
方法methods:则和计算属性不同,它不仅可以用于计算,还可以用来实现其他功能,不像计算属性这么功能单一,但methods方法没有缓存特性,每次调用都会重新运行。
看示例:
<!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">
<!-- 这里用了方法totalCountFn() -->
<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>
<!-- 目标:统计求和,求得礼物总数 -->
<!-- 而这里用了计算属性totalCount -->
<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: '篮球', num: 1 },
{ id: 2, name: '玩具', num: 2 },
{ id: 3, name: '铅笔', num: 5 },
]
},
computed: {
//计算属性是有缓存的,会将结果保存起来,下次调用会直接使用结果
totalCount () {
// 需求:对 this.list 数组里面的 num 进行求和 → reduce
let total = this.list.reduce((sum, item) => sum + item.num, 0)
return total
// //for循环一下累加也是可以的
// let sum=0
// for(let i=0;i<this.list.length;i++)
// {
// sum+=this.list[i].num
// }
// return sum
}
},
methods:{
//方法则和计算属性不同,每次调用都会重新运行
totalCountFn () {
let total = this.list.reduce((sum, item) => sum + item.num, 0)
return total
}
}
})
</script>
</body>
</html>
运行结果: