关键代码
<template>
<div>
<div v-for="(item, index) in cartItems" :key="index">
<!-- 商品展示及属性修改相关HTML -->
<input v-model="item.price" type="number" placeholder="价格">
<input v-model="item.quantity" type="number" placeholder="数量">
</div>
<p>总价: {{ totalPrice }}</p>
</div>
</template>
<script>
export default {
data() {
return {
cartItems: [
{
id: 1,
name: '商品1',
price: 10,
quantity: 2,
// 其他复杂嵌套属性
details: {
subPrice: 5
}
}
],
totalPrice: 0
};
},
mounted() {
this.calculateTotalPrice();
},
watch: {
cartItems: {
immediate: true,
deep: true,
handler(newVal, oldVal) {
this.calculateTotalPrice();
}
}
},
methods: {
calculateTotalPrice() {
this.totalPrice = this.cartItems.reduce((acc, item) => {
// 假设总价计算逻辑,这里只是简单示例
return acc + item.price * item.quantity + item.details.subPrice;
}, 0);
}
}
};
</script>
实现思路
- 数据初始化:在
data
函数中定义 cartItems
数组来存储购物车中的商品对象,以及 totalPrice
来存储总价。cartItems
中的商品对象具有复杂嵌套属性。
- 初始计算:在
mounted
钩子函数中调用 calculateTotalPrice
方法,确保页面加载时就计算出初始总价并显示。
- 侦听器设置:使用
watch
监听 cartItems
。设置 immediate: true
使侦听器在组件加载后立即执行一次 handler
函数,从而初始化总价计算。deep: true
开启深度监听,这样即使商品对象内部深层次的属性发生变化,也能触发 handler
函数。
- 总价计算:
calculateTotalPrice
方法使用 reduce
方法遍历 cartItems
数组,按照特定的计算逻辑(如商品价格乘以数量加上嵌套属性中的子价格等)计算出总价,并更新 totalPrice
,实现实时显示最新总价的功能。