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

Redux用dispatcher无法直接替换整个state的原因及正确写法疑问

问题1:直接赋值state = action.payload不生效的原因

你当前使用的是Redux Toolkit(RTK)的createSlice编写reducer,RTK底层内置Immer库实现「可变写法转不可变更新」的逻辑:

  • 你写的state.main_meals = action.payload属于修改Immer代理状态对象的属性,Immer可以捕获到这个变更,自动生成新的不可变状态,所以更新生效。
  • 你写的state = action.payload只是修改了函数内部局部变量state的引用指向,没有修改Immer代理的状态对象,也没有返回新状态,所以Immer感知不到变更,更新不生效。

问题2:全量设置state的正确写法

对于全量覆盖状态的场景,直接在reducer中return新的状态即可,Immer会直接用你return的值作为新的状态:

setDiaryState: (state, action) => {
  return action.payload;
},

关于「不推荐纯粹setter函数修改状态」的说明:这个规则是针对无意义的随意全量覆盖状态的场景,你当前需要从服务端同步完整状态快照的场景,属于合理的使用场景,这种写法完全符合Redux的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 21:45:05