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

时间:2021-01-17 19:53:13

标签: reactjs redux redux-toolkit

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

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

这是一个用于变异的reducer。

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) => {},
  },

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

为什么会这样?

切片状态示例:

initialState: {
    currentUser: {
      loggined: false,
      isAdmin: false,
      jwt: false,
    },
  },

谢谢!

1 个答案:

答案 0 :(得分:2)

Reducers 的 createSlice 使用 immer:

<块引用>

这个对象将被传递给 createReducer,因此reducer 可以安全地“改变”它们被赋予的状态。

因此,您可以从 createReducer

<块引用>

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

所以你可以这样做:

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
},

不确定如何根据旧状态返回新状态,因为 ...state 制作了沉浸式草稿的副本,而不是状态的副本。除非它是一个数组,否则甚至找不到这样做的例子。