【发布时间】:2021-09-03 08:15:48
【问题描述】:
我有这个切片:
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { IAuthState } from '../../types';
const initialState: IAuthState = {
isAuthenticated: false,
profile: null,
};
export const authSlice = createSlice({
name: 'auth',
initialState,
reducers: {
setAuthState(state, { payload }: PayloadAction<IAuthState>) {
console.log({ payload });
state = payload;
},
},
});
export const { setAuthState } = authSlice.actions;
export const authReducer = authSlice.reducer;
这是标准样板切片。
问题是,如果我这样做,我的状态不会更新。 Redux devtools 说没有变化。我的有效载荷是这样的:
{
isAuthenticated: true,
profile: {...} // big object
}
但如果我这样分配:
reducers: {
setAuthState(state, { payload }: PayloadAction<IAuthState>) {
state.isAuthenticated = payload.isAuthenticated;
state.profile = payload.profile
},
},
它更新状态。这是为什么?以及如何批量更新整个状态?
【问题讨论】:
-
好吧,这行得通。但是为什么我的尝试不起作用,为什么这会起作用?我认为整个 immer 的东西在后台“捕捉”了状态的变化。
-
state是一个本地标识符,重新分配它不会在函数之外执行任何操作。但是,在 JS 中,对象是“通过引用”传递的(不完全是,但足够接近),所以在函数内部改变对象也会在函数外部引用它的任何地方改变相同的对象。 -
是的。只是不确定为什么返回更新状态。如果我做了
state.profile=payload.profile,会发生这种情况吗? -
Redux Toolkit 通过让开发人员改变状态对象来简化状态更新,这通常在不可变状态中被禁止。 Redux Toolkit 通过传递一些可以改变而不改变实际状态的代理对象来实现这一点。返回一个新对象只会替换整个状态并忽略代理对象。
标签: javascript reactjs typescript redux redux-toolkit