如何使用Immer从reducer返回初始状态?

时间:2019-05-15 11:29:20

标签: redux immer.js

我正在研究一个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);
}

3 个答案:

答案 0 :(得分:0)

您似乎遵循了正确的模式,只是减速器的AUTH_LOGOUT情况应如下所示:

case AUTH_LOGOUT: {
    return draft[initializedAuth] = true;
}

关于返回intialState,文档中包含以下部分:

  

如果要使用此方法初始化未初始化状态   构造,您可以通过将初始状态作为第二个传递   产生参数:

const byId = produce(
    (draft, action) => {
        switch (action.type) {
            .
            .
            .
        }
    },
    intialState <-- here
)

答案 1 :(得分:0)

draft重置为initialState并设置initializedAuth

case AUTH_LOGOUT: {
  draft = initialState;         // reset to initialState
  draft.initializedAuth = true; // set to true

  break;
}

答案 2 :(得分:0)

const appReducer = (state = initialState, action) =>
produce(state, draft => {
    switch (action.type) {
        case LOGOUT:
            return initialState;