javascript 为什么createSlice中的reducer不能以不同的方式更改状态?

jm81lzqq  于 2023-05-16  发布在  Java
关注(0)|答案(1)|浏览(123)

我很想知道这两种改变状态的方式(注解和非注解)有什么区别?第一个导致问题时,调度工作不好。为什么会这样呢?

export const correctiveSlice = createSlice({
  name: "corrective",
  initialState: initialCorrectiveState,
  reducers: {
    correctContent: (state, action: PayloadAction<CorrectiveState>) => {
      // This code doesn't work
      // state = {
      //   item: {
      //     id: action.payload.item.id,
      //     text: action.payload.item.text,
      //   },
      //   edit: action.payload.edit,
      // };

      // This code works
      state.item = action.payload.item;
      state.edit = action.payload.edit;
    },
  },
});

我正在做经典的todo-list应用程序,但我使用的是redux-toolkit/react-redux库。当我尝试使用第一种方法来改变状态时,它没有改变。

8fsztsew

8fsztsew1#

如果你用state = {...}state赋值给一个全新的对象,你 * 没有 * 修改传递的state。相反,您正在将新的局部变量重新分配给新的值,即改变参考。底层方法只能访问它们传递给reducer方法的state,该方法保持不变。实际上,这不是ReduxReact的问题,而是JavaScript或任何不使用显式指针的语言的基本行为。
要修改底层变量,您必须像修改state.item = action.payload.item等那样修改它的属性,或者像here那样合并它。但是,只有在使用redux-toolkit时才允许修改状态!
或者,您使用类似return action.payload的东西 * 返回 * 新状态,而不是修改传递的state。在这种情况下,返回的项将替换先前的state。这是一个Redux特性。

相关问题