让我来为你详细讲解一下“Vue.js教程之计算属性”的完整攻略。
什么是计算属性?
在 Vue.js 中,计算属性(Computed)是一种在模板中使用的属性,通过计算属性我们可以实现一些动态的内容展示或逻辑处理,并且相较于使用方法或侦听器等方式,计算属性的实现更为简便、高效。
我们可以在 Vue 实例中使用 computed
属性来定义计算属性,该属性是一个由计算属性名与计算属性函数组成的对象,其中计算属性名是在模板中使用的名称,而计算属性函数则是用来计算并返回计算属性值的函数。
计算属性的基本使用
下面通过一个实例来演示如何定义和使用计算属性。
假设我们需要在一个商品列表页面中展现每个商品的折后价格以及每个商品的总价。其中每个商品的折后价格计算需考虑折扣率,而每个商品的总价计算需考虑商品数量和折后价。基于这个需求,我们可以使用计算属性来实现。
<template>
<div>
<h2>商品列表</h2>
<ul>
<li v-for="item in items" :key="item.id">
<span>{{ item.name }}</span>
<span>{{ item.price }}</span>
<span>{{ item.discount }}</span>
<span>{{ item.count }}</span>
<span>{{ item.finalPrice }}</span>
<span>{{ item.totalPrice }}</span>
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, name: '商品A', price: 100, discount: 0.8, count: 2 },
{ id: 2, name: '商品B', price: 200, discount: 0.9, count: 1 },
{ id: 3, name: '商品C', price: 300, discount: 0.5, count: 5 }
],
}
},
computed: {
finalPrice() {
return this.items.map(item => item.price * item.discount);
},
totalPrice() {
return this.items.map(item => item.price * item.discount * item.count);
}
}
}
</script>
在这个例子中,我们在 Vue 实例中定义了两个计算属性 finalPrice
和 totalPrice
,分别用来计算每个商品的折后价格以及商品的总价,并在模板中使用这两个计算属性来展现这些信息。
计算属性的缓存
在使用计算属性时,我们需要注意计算属性的缓存机制。在计算属性的计算函数内部,我们可以访问到 Vue 实例中的其他属性,当这些属性发生变化时,计算属性也会重新计算。而在重新计算计算属性时,如果同一个属性的值没有发生变化,那么计算属性会直接返回上一次计算的结果,而不再执行计算函数,这就是计算属性的缓存机制。
<template>
<div>
<p>单价:<input type="text" v-model="price"></p>
<p>数量:<input type="text" v-model="count"></p>
<p>总价:{{ totalPrice }}</p>
</div>
</template>
<script>
export default {
data() {
return {
price: 0,
count: 0
}
},
computed: {
totalPrice() {
console.log('totalPrice is recalculated.');
return this.price * this.count;
}
}
}
</script>
在这个例子中,我们定义了一个计算属性 totalPrice
,并在 Vue 实例中定义了两个数据属性 price
和 count
,用来计算总价。当我们在页面中输入单价和数量时,totalPrice
会重新计算,同时我们在计算函数中加入了 console.log
语句,用来查看在何时会触发计算函数的重新计算。
从结果来看,当我们在输入单价和数量后,第一次计算总价时会触发计算函数的计算,同时输出 totalPrice is recalculated.
;当我们再次改变单价或数量时,计算函数不再重新计算,而是直接返回上一次计算的结果。
优化的计算属性
在一些特殊的场景下,计算属性的计算函数内部可能会涉及到耗时的操作,例如在数据源较大的情况下进行过滤或排序操作、进行较为复杂的字符串格式化等等。在这些场景下,由于计算函数的执行频率会比较高,可能会导致应用程序的性能出现瓶颈。
针对这些问题,我们可以通过缓存计算结果的方式来优化计算属性的实现。具体实现方式为使用一个数据属性来存储计算结果,并在计算函数内部判断当前数据源与上次数据源是否相同,如果相同则直接返回上次的结果,否则重新进行计算,并将计算结果存储到数据属性中。
<template>
<div>
<p>排序方式:<input type="text" v-model="sort"></p>
<ul>
<li v-for="item in sortedItems" :key="item.id">
<span>{{ item.name }}</span>
<span>{{ item.price }}</span>
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, name: '商品A', price: 100 },
{ id: 2, name: '商品B', price: 200 },
{ id: 3, name: '商品C', price: 300 }
],
sort: '',
sortedResult: null
}
},
computed: {
sortedItems() {
if (this.sortedResult && JSON.stringify(this.items) === this.sortedResult.source) {
console.log('use the cache');
return this.sortedResult.result;
} else {
console.log('recalculated');
const result = this.items.slice();
if (this.sort) {
result.sort((a, b) => {
return a[this.sort].toString().localeCompare(b[this.sort].toString());
});
}
this.sortedResult = { source: JSON.stringify(this.items), result };
return result;
}
}
}
}
</script>
在这个例子中,我们定义了一个计算属性 sortedItems
,并在 Vue 实例中定义了一个数组 items
和一个字符串 sort
,用来进行排序操作。在计算函数内部,我们使用了一个 sortedResult
变量来缓存计算结果,通过判断数据源是否相同来决定是否使用缓存的计算结果。以此来优化计算属性的实现。
到这里,我们对Vue.js计算属性的使用和优化都有了一定的认识,如果你还有什么疑问或需要深入了解的问题,欢迎提问。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue.js教程之计算属性 - Python技术站