如何使用Redux Toolkit(RTK)重置Redux状态片段

7

我正在尝试通过redux动作resetState重置状态,在这个动作中,我将状态赋值给变量initialState,但是这种方法不起作用。

const initialState = {
  someArray: [],
  someEvents: {}
}

const stateSlice = createSlice({
  name: "someState",
  initialState,
  reducers: {
    ...someActions,
    resetState: (state, action) => {
      // THIS DOES NOT WORK
      state = initialState
    },
    resetState2: (state, action) => {
      // THIS WORKS!!!!
      return initialState
    },
});

当我返回initialState时,状态可以正确重置,但将其赋值给initialState则不行。
2个回答

16

不论你是使用Redux Toolkit还是手写reducers,将state = anything赋值给状态变量都是不正确的。这样只会将本地的state变量指向不同的引用。

createSlice使用Immer进行实现。 Immer主要通过跟踪对包装值的修改(例如 state.someField = 123)来完成工作。 Immer还允许你返回你自己构建的全新状态。

因此,在这种情况下,你需要使用return initialState返回一个新值,并强制Immer替换旧值。


嘿,马克!我正在尝试重置使用configureStore创建的存储。我没有找到任何答案。你能在这里留下评论吗?谢谢! - Piyush Aggarwal
@PiyushAggarwal 你说的“重置存储”,具体是什么意思? - markerikson
就像我刷新了页面一样。在注销时,我需要所有的“slices”都具有初始状态,而无需刷新。我知道如何为单个“slice”执行此操作。但是我无法同时为所有其他“slices”执行此操作。 - Piyush Aggarwal
@PiyushAggarwal 那是完全不相干的问题,与此无关 :) 你能单独发布那个问题吗,带上示例代码? - markerikson
我添加了一个问题。谢谢帮忙。 如何使用Redux-Toolkit在Redux存储设置中重置所有片段的初始状态? - Piyush Aggarwal

0
resetState: (state, action) => {
      Object.assign(state, action.payload)
 },

6
请勿将代码片段作为答案编写。请查看SO文档关于如何编写答案以了解如何操作。 - guzmonne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接