【问题标题】:reset redux store on logout when using react-injectors使用 react-injectors 时在注销时重置 redux 存储
【发布时间】:2021-05-27 04:39:54
【问题描述】:

我遇到了与以下问题相同的问题。但有一个不同的图书馆。 How to reset the state of a Redux store?

我正在使用来自 react-boilerplate 的 redux-injectors,并且正在使用库提供的增强器。 我需要在注销时清除所有 redux 状态,但由于我的注销位于单独的全局切片上,它只能影响全局切片而不影响其他 redux 状态。如何清除所有其他从全局状态调用动作的状态?

这是我如何组合减速器:

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

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

我的 globalReducer:

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();

【问题讨论】:

    标签: redux react-redux state-management react-boilerplate


    【解决方案1】:

    一种解决方案可能是 -

    1. 为每个受“注销”操作影响的“injected-reducer”定义一个“injected saga”。
    2. 在如此定义的“injected-saga”中,定义特定于该注入 reducer 的清理操作,同时观察“注销”操作。
    3. 因此,理论上,当调度“注销”操作时,所有如上定义的注入 saga 都将运行清理操作,从而在各个减速器中产生注销等效切片。

    试试这个,这应该解决这个问题。

    :: 更新 ::

    避免为所有其他相关组件/切片创建 saga 的一点区别。

    工作原型 - https://stackblitz.com/edit/inject-reducer?devtoolsheight=33&file=src/App.js

    【讨论】:

    • 反对者,也可以在这里使用 cmets 分享您的观点。
    • 这也是我迄今为止找到的唯一解决方案。但这很麻烦,因为我的应用程序中有太多切片。会查找更多,看看我是否找到其他任何东西。
    • 在这种情况下,更新的答案应该会有所帮助@Prateek
    • 是的,我确实必须为所有必需的减速器添加注销操作。但仍然比将它添加到每个中要好得多,谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-06-09
    • 2018-07-30
    • 2021-07-28
    • 2021-09-08
    • 2021-07-06
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多