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

Redux reducer中通过action添加导入对象至数组的实现问题

如何在Redux中动态添加从文件导入的新项到Store数组?

我完全懂你现在卡在哪了——你已经把多个单独导出的对象存在Redux Store的数组里,现在想通过action动态加新的导出项,但直接写items['action.item']报错找不到对应导出。咱们一步步把问题理顺解决:

先搞懂为啥报错

你之前写的items['action.item']是在硬找items对象里**键名为"action.item"**的属性,但你的./items文件里根本没导出叫这个名字的东西,肯定会报错啊!你真正要做的是用action传过来的字符串(也就是新项的名称)当键去访问items对象,比如如果action传的是'item3',就应该写items[action.payload]。另外你之前的state[0]也不对,你的state是个包含stuff属性的对象,不是数组,得访问state.stuff才行。

正确的实现步骤

1. 先写对action创建函数

确保你的action能正确传递新项的名称字符串:

// action.js
export const addItem = (itemName) => ({
  type: 'ADD_ITEM',
  payload: itemName // 这里传的是比如'item3'这类字符串
});

2. 在reducer里正确处理添加逻辑

先确认初始state的结构是对的:

// reducer.js
import * as items from './items';

const initialState = {
  stuff: [items.item1, items.item2]
};

然后在reducer的case里处理ADD_ITEM动作:

case 'ADD_ITEM': {
  // 根据action.payload的字符串,从items里拿到对应的项
  const newItem = items[action.payload];
  
  // 可选:加个判断,避免把不存在的项(undefined)塞进数组
  if (!newItem) {
    return state; // 也可以抛出错误或者给用户提示,看你需求
  }
  
  // 返回新的state对象,展开原有state并更新stuff数组
  return {
    ...state,
    stuff: [...state.stuff, newItem]
  };
}

额外提醒

  • 一定要保证action.payload传的字符串和./items里的导出名称完全匹配,大小写也不能错,比如导出的是item3,payload就得是'item3',不能是'Item3'或者'item-3'。
  • 如果怕重复加相同的项,可以在添加前检查state.stuff里有没有同款,比如用state.stuff.some(item => item.name === newItem.name)判断一下,避免数组里出现重复内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:13:34