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

如何在Redux或Redux Toolkit中更新嵌套对象?触发Edit Action时为selectedEmp对象赋值遭遇Immer错误求助

解决Redux Toolkit中Edit Action的Immer错误问题

我帮你分析下问题所在,以及如何修正:

错误原因

Redux Toolkit(RTK)的reducers是基于Immer实现的,它允许你用"可变"的语法编写代码,但背后会自动转换成不可变的state更新。这里的核心规则是:在同一个reducer里,你要么直接修改Immer提供的draft state(不返回任何值),要么返回一个全新的state对象,绝对不能同时做这两件事。

你的原代码里,先执行了state.users.splice(index, 1, { ...obj, selectedEmp: empObj })修改了draft,又返回了{ ...state, users: newUsers },这种混合操作直接触发了Immer的错误。


修正方案(推荐使用Immer的简洁写法)

直接修改draft state即可,不需要手动拼接新数组或返回新对象:

edit: (state, action) => {
  // 找到当前登录的用户对象
  const currentUser = state.users.find(user => user.id === state.currentUser);
  
  if (currentUser) {
    // 根据payload找到要编辑的员工
    const targetEmp = currentUser.emps.find(emp => emp.id === action.payload);
    // 直接修改currentUser的selectedEmp属性,Immer会自动处理不可变更新
    currentUser.selectedEmp = targetEmp || {};
  }
}

另一种纯不可变写法(不用Immer的可变语法)

如果你更习惯传统的不可变更新方式,也可以直接返回全新的state对象:

edit: (state, action) => {
  return {
    ...state,
    users: state.users.map(user => {
      // 只更新当前登录用户的数据
      if (user.id === state.currentUser) {
        const targetEmp = user.emps.find(emp => emp.id === action.payload) || {};
        return { ...user, selectedEmp: targetEmp };
      }
      // 其他用户保持原样
      return user;
    })
  };
}

验证效果

修改后,当触发edit action并传入对应员工ID(比如1)时,user2的selectedEmp会被正确设置为目标员工对象,完全符合你期望的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:37:32