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

如何在Redux Toolkit中修改数组类型状态的属性?

Redux Toolkit中修改数组内对象属性的正确方式

你遇到的问题源于对Redux Toolkit内置Immer包装的Proxy对象的误解,以下是两种可行的解决方法:

方法一:通过Immer直接修改目标对象

Redux Toolkit的Immer允许你在reducer中"直接"操作状态,即使state是Proxy对象,数组的find方法依然可以正常调用。找到目标对象后直接修改属性即可,Immer会自动将这个操作转换为符合不可变原则的更新:

enterUser(state, action) {
  const targetUser = state.users.find(user => user.id === action.payload);
  if (targetUser) {
    targetUser.isEnter = true;
  }
},
exitUser(state, action) {
  const targetUser = state.users.find(user => user.id === action.payload);
  if (targetUser) {
    targetUser.isEnter = false;
  }
}

调试时看到的Proxy是Immer的包装层,不会影响数组方法的正常执行,加个存在判断可以避免找不到用户时的报错。

方法二:显式生成新数组(手动不可变更新)

如果你更倾向于手动实现不可变更新,可以用map方法生成新数组,仅对目标id的对象修改属性,其余对象保持原样:

enterUser(state, action) {
  state.users = state.users.map(user => 
    user.id === action.payload ? {...user, isEnter: true} : user
  );
},
exitUser(state, action) {
  state.users = state.users.map(user => 
    user.id === action.payload ? {...user, isEnter: false} : user
  );
}

为什么current(state.users)不行?

current()函数返回的是当前状态的只读快照,它仅用于调试时查看状态的真实值,不能用来修改状态,因此修改快照内的对象属性不会同步到真实state中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:31:04