You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Redux Store获取数组?解决购物车商品添加失败问题

购物车商品无法存入Redux数组&Store数据获取方案

问题根源

  • 属性名拼写不一致:初始状态定义的是productsArr,但reducer和组件中误写为productArr(缺少末尾的s),导致始终未修改到正确的状态属性。
  • concat方法使用错误:concat()会返回新数组,不会修改原数组,因此原items数组始终为空。
  • totalQuantity未初始化:初始状态中未定义totalQuantity,直接累加会引发报错。

修复后的代码

1. Cart Slice 修正

import { createSlice } from "@reduxjs/toolkit";

const initialState = {
  productsArr: {
    items: [],
    totalQuantity: 0, // 初始化totalQuantity
  },
};

const cartSlice = createSlice({
  name: "cart",
  initialState,
  reducers: {
    addItemToCart: (state, action) => {
      // 用push直接修改数组(Redux Toolkit的Immer会自动处理不可变更新)
      state.productsArr.items.push({
        id: action.payload.productId,
        title: action.payload.productTitle,
      });
      state.productsArr.totalQuantity += 1;
    },
  },
});

export const { addItemToCart } = cartSlice.actions;
export default cartSlice.reducer;

2. Cart组件修正(修正状态路径)

const Cart = (props) => {
  // 修正状态路径为productsArr,与初始状态结构保持一致
  const cartItems = useSelector((state) => state.cart.productsArr.items);
  console.log(cartItems);

  return(
    <Card className={classes.cart}>
      <h2>Your Shopping Cart</h2>
      <ul>
        {cartItems.map((cartItem) => (
          <CartItem
            key={cartItem.id} // key需放在组件最外层,而非item对象内部
            item={{
              title: cartItem.title,
              // quantity: item.quantity,
              // total: item.totalPrice,
              // price: item.price,
            }}
          />
        ))}
      </ul>
    </Card>
  )
};

从Store获取数组的正确方式

使用Redux的useSelector钩子,传入选择器函数指定状态路径即可:

// 从cart切片中获取productsArr下的items数组
const cartItems = useSelector(state => state.cart.productsArr.items);

注意路径必须与slice中定义的初始状态结构完全匹配,否则会拿到undefined或空值。

内容的提问来源于stack exchange,提问作者max_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:03:17