最近我改变了切片,我看到一些奇怪的行为,谁能解释一下:
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不能工作在第一次尝试时,我有初始状态[]没有命名它
这里的问题不是push
或concat
,而是
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