![](/img/trans.png)
[英]How to update state ( initial State ) objects in reducer when using immer?
[英]How to return initial state from a reducer using Immer?
我正在開發一個 React 項目並使用 Redux 進行狀態管理。 我正在從 ImmutableJS 轉移到 Immer,我不確定如何通過一些更改返回初始狀態。 我正在使用 ImmutableJS 的合並,但不確定如何使用 Immer。
我到處找,找不到答案。 似乎將草稿設置為初始狀態,然后進行一些更改不起作用。
export const initialState = {
initializedAuth: false,
isAuthenticated: false,
user: null,
};
const authProviderReducer = (state = initialState, action) =>
produce(state, draft => {
switch (action.type) {
case AUTH_USER_NO_TOKEN:
draft.initializedAuth = true;
draft.isAuthenticated = false;
break;
case AUTH_UPDATE_USER_HAVE_TOKEN:
draft.initializedAuth = true;
draft.isAuthenticated = true;
break;
case AUTH_SUCCESSFUL_LOGIN:
draft.initializedAuth = true;
draft.isAuthenticated = true;
draft.user = action.payload;
delete draft.user.session;
break;
case AUTH_LOGOUT: {
// return initialState;
// draft = initialState; doesn't work
}
}
});
在AUTH_LOGOUT
,我想返回初始狀態並將其initializedAuth
屬性設置為 true。
使用 Immutablejs,我可以這樣做:
case AUTH_LOGOUT: {
return initialState.set('initializedAuth', true);
}
看起來您正在遵循正確的模式,除了您的減速器的AUTH_LOGOUT
案例應該如下工作:
case AUTH_LOGOUT: {
return draft[initializedAuth] = true;
}
關於返回 intialState,文檔中有這一節:
如果要使用此構造初始化未初始化的狀態,可以通過將初始狀態作為第二個參數傳遞來產生:
const byId = produce(
(draft, action) => {
switch (action.type) {
.
.
.
}
},
intialState <-- here
)
將draft
重置為initialState
並設置initializedAuth
。
case AUTH_LOGOUT: {
draft = initialState; // reset to initialState
draft.initializedAuth = true; // set to true
break;
}
const appReducer = (state = initialState, action) =>
produce(state, draft => {
switch (action.type) {
case LOGOUT:
return initialState;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.