Redux Toolkit - 我无法更新 Slice 状态?

Mil*_* N. 5 reactjs redux redux-toolkit

我想更新状态并尝试了几种方法来做到这一点,但我不能。首先,我在获取状态时遇到问题,因此,我得到的是代理,而不是状态。

current()这是由 redux 工具包的函数修复的。接下来,我遇到的问题是突变主切片状态。

这是一个用于变异的减速器。

reducers: {
    setUser: (state, payload) => {
      console.log("before", current(state)); //init state
      state.currentUser = {
        ...state.currentUser,
        loggined: true,
      };
      console.log("after", current(state)); // here I have new state but...
      
    },
    clearUser: (state) => {},
  },
Run Code Online (Sandbox Code Playgroud)

结果,作为第二个控制台日志,当我想更改页面或只是想通过 useSelector()redux 函数对状态中的新数据执行某些操作时,我必须声明我想要的内容,结果,我变老了,没有改变状态。

为什么会发生这种情况?

切片状态示例:

initialState: {
    currentUser: {
      loggined: false,
      isAdmin: false,
      jwt: false,
    },
  },
Run Code Online (Sandbox Code Playgroud)

谢谢!

HMR*_*HMR 9

createSlice 的减速器使用 immer:

该对象将被传递给 createReducer,因此减速器可以安全地“改变”它们所给出的状态。

因此,您可以从createReducer返回一个新状态的新对象,或者“变异”它而不返回它

您需要确保要么改变状态参数,要么返回一个新状态,但不能两者兼而有之。

所以你可以这样做:

setUser: (state, payload) => {
  //state here is an immer draft, do not use that to copy current state
  console.log("before", current(state)); //init state
  state.currentUser.loggined = true;
  //not returning anyting
},
Run Code Online (Sandbox Code Playgroud)

不确定如何根据旧状态返回新状态,因为...state复制了沉浸草稿而不是状态。除非它是一个数组,否则甚至找不到执行此操作的示例。

  • 对象传播与代理一起工作得很好。`return {...immerDraftState, field: 123}` 的行为就像普通对象一样。 (3认同)