我想更新状态并尝试了几种方法来做到这一点,但我不能。 首先,我得到了一个带有获取状态的 problem,因此,我得到的是代理,而不是状态。
这是由 redux 工具包的 current()
函数修复的。
接下来,我遇到的问题是突变主切片状态。
这是一个用于变异的reducer。
reducers: {
setUser: (state, payload) => {
console.log("before", current(state)); //init state
state.currentUser = {
...state.currentUser,
loggined: true,
};
console.log("after", current(state)); // here I have new state but...
},
clearUser: (state) => {},
},
因此,作为第二个控制台日志,当我想更改页面或只想对状态中的新数据执行某些操作时,我必须通过 useSelector()
redux 函数来说明我想要什么,结果,我老了,状态没有变。
为什么会这样?
切片状态示例:
initialState: {
currentUser: {
loggined: false,
isAdmin: false,
jwt: false,
},
},
谢谢!
答案 0 :(得分:2)
Reducers 的 createSlice 使用 immer:
<块引用>这个对象将被传递给 createReducer,因此reducer 可以安全地“改变”它们被赋予的状态。
因此,您可以从 createReducer
<块引用>你需要确保你要么改变 state 参数要么返回一个新的状态,但不能两者兼而有之。
所以你可以这样做:
setUser: (state, payload) => {
//state here is an immer draft, do not use that to copy current state
console.log("before", current(state)); //init state
state.currentUser.loggined = true;
//not returning anyting
},
不确定如何根据旧状态返回新状态,因为 ...state
制作了沉浸式草稿的副本,而不是状态的副本。除非它是一个数组,否则甚至找不到这样做的例子。