состояние не становится пустым после установки в пустой - PullRequest
0 голосов
/ 17 октября 2018

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

const appReducer = combineReducers({
  LoginReducer,
  UserJobs,
  Technologies,
  QuizData,
  MediumQuizData,
  HighQuizData,
  FetchedQuestions,
  GetAnalitics
});

const rootReducer = (state, action) => {
  if (action.type === LOGOUT_REQUEST) {
    state = undefined
  }
  return appReducer(state, action)
}

export default rootReducer

В моем магазине

export default function configureStore() {
    let store = createStore(appReducer, applyMiddleware(thunk))
    return store;
}

нажатие на выход из системы

handleLogout = () => {
        this.props.logoutUser();
    }


export function logoutUser() {
    return {
        type: LOGOUT_REQUEST
    }
}

Редуктор -

const initialState = {
    Low: [
        {
            id: 'L0',
            technologyId: 0,
            technology: '',
            type: '',
            count: '',
            level: 'EASY'
        }
    ],
}
export default function QuizData(state = initialState, action) {
    switch (action.type) {
        case QUIZ_DATA:
            return {
                ...state,
                Low: action.data,
                error: false,
            }
        case ADD_NEW:
            return {
                ...state,
                Low: action.data,
                error: false,
            }
        case REMOVE_TECH:
            return {
                ...state,
                Low: action.data,
                error: false,
            }
        default:
            return state
    }
}

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

Здесь следует установить все значения редуктора в начальные состояния, но когда я нажимаю на кнопку выхода из системы, сначала устанавливается неопределенное значение, а затем немедленноон печатает другое состояние, в котором есть все данные, которые были установлены для этого состояния.Поэтому я не понимаю, почему это происходит.

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Согласно моему пониманию, состояние сохраняется во всех рассылках действий.Когда я говорю «сохраняется», это означает, что мы заменяем объекты редуктора, зависящие от текущего состояния, на основе типа действия, передаваемого в объекте действия с учетом неизменности.Таким образом, приложение-редуктор является одним из родительских редукторов, который является отправной точкой для принятия решения о том, где обновить состояние.Таким образом, для некоторых действий вы хотите очистить все состояние в хранилище и установить его в первоначальное состояние.Вам нужно отправить черный объект вместо того, чтобы перейти в текущее состояние.

Здесь при действии выхода из системы вы можете сделать что-то вроде этого:

const rootReducer = (state, action) => {
  let copyState = state
  if (action.type === LOGOUT_REQUEST) {
    copyState = {}
  }
  return appReducer(copyState, action)
}

Любые предложения приветствуются !!

0 голосов
/ 18 октября 2018

Redux doc сообщает о combineReducers:

Обратите внимание, что каждый из этих редукторов управляет своей частью глобального состояния.Параметр состояния различен для каждого редуктора и соответствует той части состояния, которой он управляет. Это не волшебство .

Таким образом, избыточный хранит состояние внутренне (в частном порядке) , и единственный способ изменить данные в хранилище - этоотправить действие .

Я не думаю, что вам нужно очищать все ваше состояние, потому что, как вы упомянули в комментарии, выдается ошибка, что подписанный компонент не может прочитать undefined.Что вам действительно нужно - это поставить ваше состояние в начальные значения .

Если вы предпочитаете, чтобы все было так, как вы уже начали, возможно, вы импортируете initialState каждого редуктора, а для LOGOUT_REQUEST возвращаете объект с исходным деревом:

import { initialState as LoginReducer } from './LoginReducer';
import { initialState as UserJobs } from './UserJobs';
...

const rootReducer = (state, action) => {
  if (action.type === LOGOUT_REQUEST) {
    return {
      LoginReducer,
      UserJobs,
      ... // all other initial values should be here as well
    }
  }
  return appReducer(state, action)
}

Второе решение заключается в прослушивании LOGOUT_REQUEST в каждом редукторе и выдаче initialState:

 const initialState = {
    Low: [
        ...
    ],
}
export default function QuizData(state = initialState, action) {
    switch (action.type) {
        case QUIZ_DATA:
            ...
        case 'LOGOUT_REQUEST':
            return initialState;
        default:
            return state
    }
}

Надеюсь, это поможет.

0 голосов
/ 17 октября 2018

Я думаю, что вы должны вернуть состояние = undefined,

 if (action.type === LOGOUT_REQUEST) {
   return state = undefined
  }

, иначе appreducer всегда будет иметь текущее состояние.Когда вы возвращаете неопределенное состояние, Store устанавливает его в исходное состояние.

Если вы хотите сохранить некоторые элементы в ваших редукторах и не очистить их, например, Locales или некоторые общие модули для гостя и пользователя,Вы можете сделать что-то вроде этого:

const rootReducer = (state, action) => {
  if (action.type === 'LOG_OUT') {
    const localeReducer = state.localeReducer;
    return Object.assign({}, initialState, {
      localeReducer,
    });
  }

  return appReducer(state, action);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...