Redux Toolkit购物车问题:添加同ID商品时合并数量而非新增条目
问题解决思路及修正代码
你的问题出在forEach的逻辑上:遍历购物车每一项时,只要当前项和要添加的商品ID不匹配,就直接执行push,这会导致同一个商品被多次添加。另外,你的商品结构里没包含数量字段,没法实现"合并卡片+增数"的效果。
修正方案如下:
- 给每个商品增加
quantity字段记录数量 - 先通过ID查找购物车中是否已有该商品,再分情况处理:
- 已有商品:直接增加该商品的
quantity和购物车总数量 - 无该商品:将商品以
quantity:1的形式加入购物车,同时增加总数量
- 已有商品:直接增加该商品的
- 完善移除商品的逻辑(原逻辑只减总数量,没处理商品本身的数量)
修正后的完整代码:
const initialState = { items: [], totalQuantity: 0, }; const cartSlice = createSlice({ name: "cart", initialState, reducers: { addItemToCart: (state, action) => { // 查找购物车中是否已有该商品 const existingItem = state.items.find(item => item.id === action.payload.id); if (existingItem) { // 已有商品:增加数量 existingItem.quantity += 1; state.totalQuantity += 1; } else { // 无该商品:新增商品,默认数量为1 state.items.push({ ...action.payload, quantity: 1 }); state.totalQuantity += 1; } }, removeItemFromCart: (state, action) => { // 要移除的商品ID通过action.payload传入 const existingItem = state.items.find(item => item.id === action.payload.id); if (existingItem) { if (existingItem.quantity > 1) { // 数量大于1时,只减数量 existingItem.quantity -= 1; state.totalQuantity -= 1; } else { // 数量为1时,移除该商品 state.items = state.items.filter(item => item.id !== action.payload.id); state.totalQuantity -= 1; } } }, }, });
注意点:
- 移除商品时,要把商品ID通过
action.payload传给reducer,这样才能精准找到要操作的商品 - 使用Redux Toolkit时,因为它内置了Immer,所以可以直接修改state对象(像
existingItem.quantity +=1这种写法是允许的,Immer会帮你转换成不可变更新)
内容的提问来源于stack exchange,提问作者max_
相关产品推荐
相关产品推荐

