为什么切片push工作在redux而不是concat?



最近我改变了切片,我看到一些奇怪的行为,谁能解释一下:

const initialState = {
[]
};
export const userSlice = createSlice({
name: "user",
initialState,
reducers: {
loadUsers(state, action) {
state = state.concat(action.payload);
},
},
});

当我这样做的时候,状态不会改变,负载也不会添加到状态数组

我可以像

for(let i=0; i < action.payload.length; i++) {
state.push(action.payload[i]
}

和一切工作正常,然后我意识到,如果将状态命名为初始状态:

const initialState = {
users: [],
};

然后我可以这样写:

state.users = state.users.concat(action.payload);

loadUsers减速器和这个工作也很好谁能解释一下为什么concat不能工作在第一次尝试时,我有初始状态[]没有命名它

这里的问题不是pushconcat,而是

state = something

将永远不会做任何事情。

Redux Toolkit监视变量state中的对象是否有修改-但是赋值会丢弃该对象,并将新对象放入变量而不是更改它。

不能被观察到。

相反,您可以使用

return something

有关更多信息,请参见使用immer写入还原器,特别是复位和替换状态,其中说:

一个常见的错误是尝试直接分配state = someValue。这行不通!这只会将局部状态变量指向不同的引用。这既不会改变内存中现有的状态对象/数组,也不会返回一个全新的值,因此Immer不会进行任何实际的更改。

加上上一个答案,做一个区别。您不应该尝试像

行那样改变整个状态。
State = something

但是你可以而且应该用这种方式改变状态属性,事实上这是redux工具箱和immer的主要优点之一,所以

State.prop = something 

就可以了。现在是重申这种状态突变只在redux工具包中可以的好时机,其中immer正在执行它的工作。

这里是相关文档的链接

https://redux-toolkit.js.org/usage/immer-reducers resetting-and-replacing-state

相关内容

  • 没有找到相关文章

最新更新