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
相关产品推荐
相关产品推荐

