Как вернуть исходное состояние из редуктора с помощью Immer? - PullRequest
0 голосов
/ 15 мая 2019

Я работаю над проектом 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);
}

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Сброс draft на initialState и установка initializedAuth.

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

  break;
}
0 голосов
/ 15 мая 2019

Похоже, что вы следуете правильному шаблону, за исключением того, что AUTH_LOGOUT корпус вашего редуктора должен работать следующим образом:

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

Что касается возврата intialState, этот раздел есть в документации:

Если вы хотите инициализировать неинициализированное состояние, используя эту конструкцию, вы можете сделать это, передав начальное состояние в качестве второго аргумента для получения:

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