Redux Toolkit的slice reducer无法更新初始为null的state如何解决?
问题根因
你遇到的问题是Redux Toolkit(以下简称RTK)内置的Immer库的语法规则导致的:
RTK的reducer写法依赖Immer实现"看似可变"的语法糖,实际底层还是会生成符合Redux要求的不可变状态,Immer支持两种更新写法:
- 当state是引用类型(对象、数组)时,可以直接修改state的属性,Immer会自动跟踪变更生成新状态
- 当state是原始类型(null、数字、字符串、布尔值),或者需要直接替换整个state对象/数组时,必须直接return新值,不能给state参数直接赋值
你代码里的state = action.payload仅仅是修改了reducer函数内部局部变量的指向,不会被Immer识别为状态变更,所以无论你赋什么值都不会触发状态更新。
修复方案
只需要修改slice的reducer逻辑,直接返回新的状态值即可:
import {createSlice} from '@reduxjs/toolkit'; export const userSlice = createSlice({ name: 'user', initialState: null, reducers: { updateUser: (state, action) => { // 直接返回payload作为新状态,不需要赋值给state return action.payload; }, }, }); export const {updateUser} = userSlice.actions; export default userSlice.reducer;
补充说明
你之前把initialState改成对象后功能正常,是因为那时候你应该是通过修改state对象的属性来更新,符合Immer对引用类型的更新规则,所以能生效。现在你需要初始值为null(原始类型),就必须用return新值的方式更新。
内容的提问来源于stack exchange,提问作者jmsandiegoo
相关产品推荐
相关产品推荐

