【问题标题】:Redux Toolkit - I can't update Slice state?Redux Toolkit - 我无法更新 Slice 状态?
【发布时间】:2021-04-22 04:55:36
【问题描述】:

我想更新状态并尝试了几种方法来做到这一点,但我做不到。 首先,我得到了一个 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 函数来说明我想要的内容,作为结果,我老了,状态没有变。

为什么会这样?

Slice 状态示例:

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

谢谢!

【问题讨论】:

    标签: reactjs redux redux-toolkit


    【解决方案1】:

    Reducers 的 createSlice 使用 immer:

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

    因此,您可以从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
    },
    

    不确定如何根据旧状态返回新状态,因为 ...state 会复制 immer 草案而不是状态。除非它是一个数组,否则甚至找不到这样做的例子。

    【讨论】:

    • 感谢您的回答。工作,但这是下一个问题:在调度 setUser 并更新值重定向到另一个页面后,我有逻辑检查状态使用:const user = useSelector(currentUser);,在user 变量中我得到了初始化,或者旧状态,没有更新?
    • 对象传播适用于代理。 return {...immerDraftState, field: 123} 的行为就像处理普通对象一样。
    • @MiloshN。您确定操作正确调度并将状态设置为您想要的(您是否检查了 redux devtools)?什么是不起作用的选择器,它在哪里调用?
    猜你喜欢
    • 1970-01-01
    • 2020-05-23
    • 2020-12-14
    • 2022-06-22
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多