微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用反应注入器时在注销时重置 redux 存储

如何解决使用反应注入器时在注销时重置 redux 存储

我遇到了与以下问题相同的问题。但有一个不同的图书馆。 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();

解决方法

一种解决方案可能是 -

  1. 为每个“injected-reducer”定义一个“injected saga”,该“injected-reducer”受到“logout”操作的副作用。
  2. 在如此定义的“injected-saga”中,定义特定于注入的 reducer 的清理操作,同时观察“注销”操作。
  3. 因此,理论上,当“注销”操作被分派时,所有注入的 saga 像上面定义的一样将运行清理操作,导致在各个减速器中注销等效的切片。

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

:: 更新 ::

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。