Vuex 仅在单击 for 循环内第一行的按钮时更新组件
Vuex only updating component when clicking on the button of the first row inside for loop
我正在和 Vuex 打交道,我几乎让它工作了,只有这个问题困扰着我。你看,我有一个产品列表,每个产品都有自己的“addToCart()”点击事件。
将产品添加到购物车后,应该在 Home.vue 组件中更新购物车。奇怪的是,这仅在单击第一个产品的 addToCart 按钮或您第一次为第二个产品使用该按钮时更新。只有当您点击第一个产品的按钮时,它才会更新两个产品的数量。
这是我的代码,这里是组件 Home.vue:
<template>
<div class="home">
<div v-for="product in cart" :key="product.id">
{{product.name}} {{product.quantity}}
</div>
<div v-for="product in products" :key="product.id">
{{product.name}}
<button @click="addToCart(product)">Add to cart</button>
</div>
</div>
</template>
<script>
export default {
/* eslint-disable */
name: 'Home',
data () {
return {
products: [
{
id: 1,
name: 'Appeltaart',
price: '20.00'
},
{
id: 2,
name: 'Chocoladetaart',
price: '15.40'
}
],
}
},
computed: {
cart() {
return this.$store.getters.cart
}
},
beforeMount() {
},
methods: {
addToCart(product) {
this.$store.commit('addToCart', product)
},
}
}
</script>
最后,这是我的 Vuex 文件 Index.js:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
/* eslint-disable */
state: {
cart: [],
newCartItem: {
id: 0,
name: '',
price: 0,
quantity: 0,
},
},
mutations: {
addToCart (state, product) {
console.log(state.cart)
let findProduct = state.cart.find(o => o.id === product.id)
if ( findProduct ) {
findProduct.quantity += 1;
} else {
state.newCartItem.id = product.id
state.newCartItem.name = product.name;
state.newCartItem.price = product.price;
state.newCartItem.quantity = 1;
state.cart.push(state.newCartItem)
state.newCartItem = {}
}
}
},
actions: {
},
modules: {
},
getters: {
cart: state => state.cart
}
})
点击第一个商品的addToCart也出现这个错误:
[Vue warn]: Duplicate keys detected: '1'. This may cause an update error.
[Vue warn]: Duplicate keys detected: '2'. This may cause an update error.
编辑不仅是第一个产品,它总是您点击的第二个产品的addToCart
更新 修复了重复键问题
尝试在您的商店中将 state.cart.push(state.newCartItem)
替换为 state.cart.push(Object.assign({},state.newCartItem))
它将使观察者处于可能成功的状态
您的购物车将是
0: {__ob__: Observer}
1: {__ob__: Observer}
而不是
0: {__ob__: Observer}
1: {id: 2, name: "Chocoladetaart", price: "15.40", quantity: 2, __ob__: Observer}
我正在和 Vuex 打交道,我几乎让它工作了,只有这个问题困扰着我。你看,我有一个产品列表,每个产品都有自己的“addToCart()”点击事件。
将产品添加到购物车后,应该在 Home.vue 组件中更新购物车。奇怪的是,这仅在单击第一个产品的 addToCart 按钮或您第一次为第二个产品使用该按钮时更新。只有当您点击第一个产品的按钮时,它才会更新两个产品的数量。
这是我的代码,这里是组件 Home.vue:
<template>
<div class="home">
<div v-for="product in cart" :key="product.id">
{{product.name}} {{product.quantity}}
</div>
<div v-for="product in products" :key="product.id">
{{product.name}}
<button @click="addToCart(product)">Add to cart</button>
</div>
</div>
</template>
<script>
export default {
/* eslint-disable */
name: 'Home',
data () {
return {
products: [
{
id: 1,
name: 'Appeltaart',
price: '20.00'
},
{
id: 2,
name: 'Chocoladetaart',
price: '15.40'
}
],
}
},
computed: {
cart() {
return this.$store.getters.cart
}
},
beforeMount() {
},
methods: {
addToCart(product) {
this.$store.commit('addToCart', product)
},
}
}
</script>
最后,这是我的 Vuex 文件 Index.js:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
/* eslint-disable */
state: {
cart: [],
newCartItem: {
id: 0,
name: '',
price: 0,
quantity: 0,
},
},
mutations: {
addToCart (state, product) {
console.log(state.cart)
let findProduct = state.cart.find(o => o.id === product.id)
if ( findProduct ) {
findProduct.quantity += 1;
} else {
state.newCartItem.id = product.id
state.newCartItem.name = product.name;
state.newCartItem.price = product.price;
state.newCartItem.quantity = 1;
state.cart.push(state.newCartItem)
state.newCartItem = {}
}
}
},
actions: {
},
modules: {
},
getters: {
cart: state => state.cart
}
})
点击第一个商品的addToCart也出现这个错误:
[Vue warn]: Duplicate keys detected: '1'. This may cause an update error.
[Vue warn]: Duplicate keys detected: '2'. This may cause an update error.
编辑不仅是第一个产品,它总是您点击的第二个产品的addToCart
更新 修复了重复键问题
尝试在您的商店中将 state.cart.push(state.newCartItem)
替换为 state.cart.push(Object.assign({},state.newCartItem))
它将使观察者处于可能成功的状态
您的购物车将是
0: {__ob__: Observer}
1: {__ob__: Observer}
而不是
0: {__ob__: Observer}
1: {id: 2, name: "Chocoladetaart", price: "15.40", quantity: 2, __ob__: Observer}