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

React Toolkit中Slice的sortBy方法抛出Immer错误,如何解决?

问题原因与解决方法

错误根源

你遇到的Immer错误,核心原因是Array.sort()是原地修改数组的方法。你的sortBy reducer里,既返回了一个新的状态对象,又通过state.characters.sort()修改了原state中的数组(也就是Immer管理的draft对象),违反了Immer的规则:要么修改draft对象,要么返回全新的状态值,不能同时操作。

两种解决方式

方式1:返回新状态时避免修改原数组

先复制原数组,再对复制后的数组排序,这样不会触碰原draft数组:

sortBy: (state) => {
  return {
    ...state,
    // 用扩展运算符复制数组后再排序
    characters: [...state.characters].sort((a, b) => a.mass - b.mass),
  };
},

也可以用slice()方法复制数组,效果完全一致:

characters: state.characters.slice().sort((a, b) => a.mass - b.mass)

方式2:直接修改draft对象(Immer推荐写法)

不返回新对象,直接修改state的characters属性,Immer会自动处理不可变更新:

sortBy: (state) => {
  // 复制数组后排序,再赋值给state.characters
  state.characters = [...state.characters].sort((a, b) => a.mass - b.mass);
},

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:55:21