Можно ли использовать getState () внутри редуктора? - PullRequest
0 голосов
/ 03 апреля 2020

Редуктор входа в систему работает нормально, но когда я добавляю редуктор выхода из системы, он не работает.

export const rootReducer = combineReducers({
    login: loginReducer,
    logout: logoutReducer
});

export const loginReducer = (state = initialState, { type, payload } :any) => {
  switch (type) {
    case "login":
      return {...state, token: payload};
    default:
      return state;
  }
};

Я запускаю мутацию graphql, если вход успешен, возвращается токен, который хранится с использованием приставки. Позже эта информация используется для приватной маршрутизации и т. Д. c.

let submitForm = (email: string, password: string) => {
    setIsSubmitted(true);
    login({
      variables: {
        email: email,
        password: password,
      },
    })
      .then(({ data }: any) => {
        dispatch({ type: "login", payload: data.loginEmail.accessToken })

Теперь я хочу добавить редуктор выхода из системы. Я хочу выйти из системы, если нажата кнопка. Если я добавлю это в свой rootReducer, он будет скомпилирован без ошибки.

const initialState = {
  token: null
};
const storeValue = store.getState();

export const logoutReducer = (state = initialState, { type, payload } :any) => {
switch (type) {
  case "check":
    return {...state, token: payload};
  default:
    return state;
}
};

Однако, если я сделаю state = storeValue вместо initialState, я получу ошибки при определении storeValue & logout, что

'storeValue'/logout implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.ts(7022)

Редактировать:

Вот как работает мой privateRouting:

export const PrivateRoute = ({ component, ...rest }: any) => {
  const routeComponent = (props: any) => {
    if(store.getState().login.token) {
      return React.createElement(component, props)
    }
    else {
      return <Redirect to={{ pathname: '/404' }} />
    }
  }    
  return <Route {...rest} render={routeComponent} />;
};

Я уже упоминал выше, как хранить свой токен в функция submitForm. В зависимости от этого, как я могу использовать тот же редуктор login для реализации выхода из системы?

<ExitToAppIcon onClick={logout}></ExitToAppIcon>

1 Ответ

0 голосов
/ 03 апреля 2020

Подумав (не проверял, чтобы быть уверенным), я думаю, что ответ - нет. Вы не можете использовать getState () внутри редуктора.

Насколько я понимаю, как работает редукс (и я могу ошибаться, так что дважды проверьте его сами) - состояние генерируется после того, как все редукторы будут вызваны первыми. Таким образом, store.getState(), вероятно, undefined до того, как редуктор (ы) будут запущены в первый раз.

Поскольку вы хотите установить initialState - вы даже не можете сделать что-то вроде store.getState().keyYouAreLookingFor, чтобы использовать его в logoutReducer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...