сбросить хранилище избыточности при выходе из системы при использовании реактивных инжекторов

У меня та же проблема, что и в следующем вопросе. но с другой библиотекой. Как сбросить состояние хранилища Redux?

Я использую редукс-инжекторы из react-boilerplate и использую усилители, предоставленные из библиотека. Мне нужно очистить все состояние избыточности при выходе из системы, но поскольку мой выход из системы находится в отдельном глобальном срезе, это может повлиять только на глобальный срез, а не на другие состояния избыточности. Как очистить все остальные состояния, вызывающие действие из глобального состояния?

Вот как я комбинирую редукторы:

import { combineReducers } from '@reduxjs/toolkit';

export function createReducer(injectedReducers = {}) {
  if (Object.keys(injectedReducers).length === 0) {
    return state => state;
  }
  return combineReducers({
    ...injectedReducers
  });
}

мой глобальный редуктор:

import { createSlice } from '@reduxjs/toolkit';

const initialState = {
  loading: false
};

const globalSlice = createSlice({
  name: 'global',
  initialState,
  reducers: {
    logout(state) {
      return state;
    }
  }
});

export const { actions, reducer, name: sliceKey } = globalSlice;

мой магазин/index.js

import { configureStore, getDefaultMiddleware } from '@reduxjs/toolkit';
import { createInjectorsEnhancer, forceReducerReload } from 'redux-injectors';
import createSagaMiddleware from 'redux-saga';
import { createReducer } from './reducers';

function configureAppStore() {
  const reduxSagaMonitorOptions = {
    onError: (error, { sagaStack }) => {
      // console.log(error, sagaStack);
    }
  };
  const sagaMiddleware = createSagaMiddleware(reduxSagaMonitorOptions);
  const { run: runSaga } = sagaMiddleware;

  // Create the store with saga middleware
  const middlewares = [sagaMiddleware];

  const enhancers = [
    createInjectorsEnhancer({
      createReducer,
      runSaga
    })
  ];

  const store = configureStore({
    reducer: createReducer(),
    middleware: [
      ...getDefaultMiddleware({
        serializableCheck: {
          ignoredActionPaths: ['payload.history']
        },
        immutableCheck: false
      }),
      ...middlewares
    ],
    devTools:
      process.env.NODE_ENV !== 'production'
      || process.env.PUBLIC_URL.length > 0,
    enhancers
  });

  // Make reducers hot reloadable, see http://mxs.is/googmo
  if (module.hot) {
    module.hot.accept('./reducers', () => {
      forceReducerReload(store);
    });
  }

  return store;
}

export const store = configureAppStore();

person Prateek    schedule 27.05.2021    source источник


Ответы (1)


Одним из решений может быть -

  1. Определите инжектированную сагу для каждого инъекционного редуктора, на который побочно влияет действие выхода из системы.
  2. В такой определенной саге о внедрении определите действия по очистке, характерные для этого введенного редуктора, при этом наблюдая за действием выхода из системы.
  3. Таким образом, теоретически, когда действие выхода из системы отправляется, все введенные саги, определенные, как указано выше, будут запускать действия очистки, в результате чего в отдельных редюсерах будет эквивалентен выход из системы.

Попробуйте это, и это должно разобраться.

:: Обновлено ::

Небольшая разница, чтобы избежать создания саги для всех других соответствующих компонентов/фрагментов.

Рабочий прототип — https://stackblitz.com/edit/inject-reducer?devtoolsheight=33&file=src/App.js

person H S    schedule 27.05.2021
comment
Downvoters, поделитесь своим мнением, используя комментарии и здесь. - person H S; 27.05.2021
comment
это единственное решение, которое я нашел до сих пор. Но это громоздко, так как в моем приложении слишком много фрагментов. буду искать больше, чтобы увидеть, если я найду что-нибудь еще. - person Prateek; 27.05.2021
comment
обновленный ответ должен помочь в этом случае @Prateek - person H S; 27.05.2021
comment
да, это сработало, мне пришлось добавить действия выхода из системы для всех необходимых редукторов. Но все же намного лучше, чем добавлять его к каждому, спасибо - person Prateek; 28.05.2021