как сбросить хранилище при выходе? - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь сбросить хранилище при выходе из системы, но, похоже, оно совсем не работает.

Как вы можете видеть, я использую AsyncStorage для своего магазина и пытаюсь следовать ответу от this post.

Вот мой index.js из папки магазина

import thunk from 'redux-thunk';
import { createStore, compose, applyMiddleware } from 'redux';
import { AsyncStorage } from 'react-native';
import { persistStore, autoRehydrate } from 'redux-persist';
import rootReducer from '../reducers';

var defaultState = {};

export function configureStore(initialState = defaultState) {
  var store = createStore(rootReducer, initialState, compose(
    applyMiddleware(thunk),
    autoRehydrate(),
  ));
  persistStore(store, { storage: AsyncStorage });
  return store;
}

, а вот мой index.js из папки редукторов

import { combineReducers } from 'redux';
import { reducer as formReducer } from 'redux-form';
import { AsyncStorage } from 'react-native';

import authReducer from './authReducer';
import alertsReducer from './alertsReducer';
import jobsReducer from './jobsReducer';
import userDataReducer from './userDataReducer';

const appReducer = combineReducers({
  form: formReducer,
  auth: authReducer,
  alerts: alertsReducer,
  jobs: jobsReducer,
  userData: userDataReducer
})

const rootReducer = ( state, action ) => {
  if(action.type === 'UNAUTH_USER') {
    Object.keys(state).forEach(key => {
      AsyncStorage.removeItem(`persist:${key}`);
      console.log(state)
    });
  }
  return appReducer(state, action)
}

export default rootReducer

1 Ответ

0 голосов
/ 19 августа 2018

Вкл. Начальная загрузка нашего приложения. Состояние редуктора: fresh .

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

Шаг 1: вызвать действие при загрузке приложения, которое скопирует исходное состояние редуктора как defaultState

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

Компонент root приложения

  componentDidMount() {   
    dispatch(ON_APP_LOAD)
  }

Редуктор приложения

const appReducer = combineReducers({
  user: userStatusReducer,     
  analysis: analysisReducer,
  incentives: incentivesReducer
});

let defaultState = null;
export default (state, action) => {
  switch (action.type) {
    case **ON_APP_LOAD**:
      // will be assigned or called only once 
      defaultState = defaultState || state;
      break;
    case **RESET_STATE**:
      // detaching the reference on reset
      state = _.deepClone(defaultState);
      return state;
    default:
      break;
  }
  return appReducer(state, action);
};

Выйти из системы, вызывая действие для сброса состояния

function* logoutUser(action) {
  // on logout success 
  dispatch("RESET_STATE")
}
...