【问题标题】:Redux - Does initialState need to be an object in createSlice()?Redux - initialState 是否需要成为 createSlice() 中的对象?
【发布时间】:2022-11-30 18:31:24
【问题描述】:

当我发送时,下面的代码会抛出一个错误:

// countSlice.js
const countSlice = createSlice({
    name: "count",
    initialState: 0,
    reducers: {
        add(state) {state += 1},
    },
});

但是,如果我将 initialState 更改为对象,则代码可以正常工作:

// countSlice.js
const countSlice = createSlice({
    name: "count",
    initialState: {value: 0}, // now it works!
    reducers: {
        add(state) {state.value += 1},
    },
});

如果我将 initialState 保留为数字,但将 reducer 编写为数组函数,则该代码也有效:

// countSlice.js
const countSlice = createSlice({
    name: "count",
    initialState: 0,
    reducers: {
        add: state => state + 1, // also works!
    },
});

我只是在学习 Redux,对此感到困惑。这跟Immer有关系吗?我在 reducer 函数上弄错了吗?

【问题讨论】:

  • 它应该可以工作,因为他们在官方文档中做了完全相同的事情。你得到哪个错误?
  • @timotgl Uncaught Error: A case reducer on a non-draftable value must not return undefined来自createReducer.ts
  • 仔细检查文档后,看起来他们处理状态的方式不同。对于reducers: { nameOfAction(state) { // mutate state }},状态应该是一个对象。使用reducers: { nameOfAction: state => state + 1},状态可以是任何东西。这是一个细微的差别,文档中的示例可能有点误导。在真实的应用程序中,状态很少是一个奇异值,那不是很有用。
  • 我懂了。然后我将把它声明为一个对象,这似乎是更好的做法。

标签: redux react-redux immer.js


【解决方案1】:

之所以

const countSlice = createSlice({
    name: "count",
    initialState: 0,
    reducers: {
        add(state) {state += 1},
    },
});

不起作用,是因为您的添加减速器实际上没有返回任何东西。如果状态是一个对象,这很好,因为对象是可变的。但是如果你的状态只是一个整数,那么你需要返回它来实际更新状态,因为整数是不可变的。

【讨论】:

    【解决方案2】:

    如果您想将初始状态设置为一个值而不是一个对象,您只需返回状态本身

    const idSlice = createSlice({ 名称:“idSlice”, 初始状态:“”, 减速器:{ setId(状态,动作){ state = action.payload; 返回状态; }, }, });

    我这样做了,对我有用

    【讨论】:

      猜你喜欢
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多