簡體   English   中英

如何使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM