【发布时间】:2023-01-04 23:27:14
【问题描述】:
我正在使用 computed() 方法将一些数据添加到对象的 ref() 数组中。
使用这个计算的对象数组可以读取数据,例如使用 v-for,但是当我尝试更新数据时它被忽略(没有任何反应),下面的示例显示了工作代码与不工作代码。
在 useCart 可组合项(参见下面的代码)中,我创建了一个 computedCartItems,它映射购物车并为每个项目添加总价。现在在我的 index.vue 文件中,我尝试增加 cartItem 的数量,如果我使用 <div v-for="cartItem in cart"> 遍历 cart,这会起作用,但在使用计算对象 <div v-for="cartItem in computedCartItems"> 时它会被忽略
使用Cart.js
const useCart = () => {
const cart = ref([])
const computedCartItems = computed(() => {
return cart.value.map(cartItem => {
return {
...cartItem,
totalPrice: cartItem.amount * cartItem.price
}
})
})
return {
cart,
computedCartItems,
}
}
export default useCart
index.vue(不工作,使用计算的'computedCartItems'对象)
<div v-for="cartItem in computedCartItems">
<div>
<div>{{ cartItem.name }}</div>
<button @click="onIncrement(cartItem)">+</button>
</div>
</div>
<script setup>
const { cart, computedCartItems } = useCart()
const onIncrement = ({ id }) => {
const shoppingCartItemIndex = computedCartItems.value.findIndex(item => item.id === id)
computedCartItems.value[shoppingCartItemIndex].amount++
}
</script>
index.vue(工作,使用原始的“购物车”对象)
<div v-for="cartItem in cart">
<div>
<div>{{ cartItem.name }}</div>
<button @click="onIncrement(cartItem)">+</button>
</div>
</div>
<script setup>
const { cart, computedCartItems } = useCart()
const onIncrement = ({ id }) => {
const shoppingCartItemIndex = cart.value.findIndex(item => item.id === id)
cart.value[shoppingCartItemIndex].amount++
}
</script>
【问题讨论】:
-
计算用于创建派生数据。您不能修改基本计算(您可以使用 getter 和 setter 创建计算)。您必须修改源数据。我可以尝试将其写成一个正确的答案 - 基于文档 - 如果你愿意的话?
标签: javascript vue.js vuejs3