[英]Why does slice push work in redux but not concat?
最近我换成了切片,我看到一些奇怪的行为有人可以解释一下:
const initialState = {
[]
};
export const userSlice = createSlice({
name: "user",
initialState,
reducers: {
loadUsers(state, action) {
state = state.concat(action.payload);
},
},
});
当我做这样的事情时,state 不会改变,有效负载也不会添加到 state 数组
我可以 go 喜欢
for(let i=0; i < action.payload.length; i++) {
state.push(action.payload[i]
}
一切正常,然后我意识到如果将 state 初始 state 命名为:
const initialState = {
users: [],
};
然后我可以像 go 这样:
state.users = state.users.concat(action.payload);
在loadUsers reducer 上,这项工作也很好有人可以解释为什么concat在我有 [] 的初始 state 而没有命名时第一次尝试时无法工作
这里的问题不是push
或concat
,而是事实
state = something
永远不会做任何事情。
Redux Toolkit 监视处于变量state
的对象以进行修改 - 但该赋值会丢弃该对象并将新对象放入变量中而不是更改它。
这是无法观察到的。
相反,你可以做
return something
有关更多信息,请参阅使用immer
编写immer
,尤其是重置和替换 state ,其中说:
一个常见的错误是尝试直接分配
state = someValue
。 这行不通! 这只会将局部状态变量指向不同的引用。 这既不会改变内存中现有的状态对象/数组,也不会返回全新的值,因此 Immer 不会进行任何实际更改。
添加到先前的答案,以进行区分。 你不应该像在行中那样尝试改变整个 state
State = something
但是你可以而且应该以这种方式改变 state 属性,事实上它是 redux 工具包和 immer 的主要好处之一,所以
State.prop = something
没问题。 现在是重申这种 state 突变的好时机,只有在 redux 工具包中 immer 正在做它的工作。
同样,这里是相关文档的链接
https://redux-toolkit.js.org/usage/immer-reducers#resetting-and-replacing-state
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.