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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 06:00:01