繁体   English   中英

为什么 slice push 在 redux 中有效,但在 concat 中无效?

[英]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 而没有命名时第一次尝试时无法工作

这里的问题不是pushconcat ,而是事实

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM