【发布时间】: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