【问题标题】:react/redux/immutable/redux persist: not persisting to localstoragereact/redux/immutable/redux persist:不持久化到本地存储
【发布时间】:2019-09-20 11:25:11
【问题描述】:

已搜索,仅找到与我的问题松散相关的问题。

拥有一个状态由不可变记录组成的 redux 应用程序。

希望仅将我的状态的一个子集序列化/反序列化到本地存储:

\Application <- Immutable Record
    \user <- regular js object
    \...
\...

这是我目前的configureStore

import {
  compose, createStore, applyMiddleware, combineReducers,
} from 'redux';
import thunkMiddleware from 'redux-thunk';
import createLogger from 'redux-logger';
import createHistory from 'history/createBrowserHistory';
import { routerMiddleware, routerReducer } from 'react-router-redux';
import { persistStore, persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage';
import immutableTransform from 'redux-persist-transform-immutable';
import { Application } from '../modules/application/records/application';
import rootReducer from '../modules/reducers';

const persistConfig = {
  transforms: [immutableTransform()],
  key: 'root',
  storage,
};

const history = createHistory();
const reduxRouterMiddleware = routerMiddleware(history);

const reducer = combineReducers({
  ...rootReducer,
  routing: routerReducer,
});

const persistedReducer = persistReducer(persistConfig, reducer);

const createStoreWithMiddleware = compose(
  applyMiddleware(thunkMiddleware, reduxRouterMiddleware, createLogger()),

  window.devToolsExtension ? window.devToolsExtension() : f => f,
)(createStore);

export default function configureStore(initialState) {
  const store = createStoreWithMiddleware(persistedReducer, initialState);

  // reduxRouterMiddleware.listenForReplays(store);

  if (module.hot) {
    // Enable Webpack hot module replacement for reducers
    module.hot.accept('../modules/reducers', () => {
      const nextRootReducer = require('../modules/reducers');
      store.replaceReducer(nextRootReducer);
    });
  }

  return persistStore(store);
}

现在,这不仅没有将任何数据保存到我的本地存储中,它还以某种方式强制我的所有状态为 null,因此,例如,Application 没有孩子,我希望在其中有一个 @ 987654326@。

如何正确配置我的 configureStore 以仅保留 Application/user 对象?

【问题讨论】:

    标签: reactjs redux immutable.js redux-persist


    【解决方案1】:

    我需要更新我的configureStore 如下:

    import {
      compose, createStore, applyMiddleware, combineReducers,
    } from 'redux';
    import thunkMiddleware from 'redux-thunk';
    import createLogger from 'redux-logger';
    import createHistory from 'history/createBrowserHistory';
    import { routerMiddleware, routerReducer } from 'react-router-redux';
    import { persistStore, persistReducer } from 'redux-persist';
    import storage from 'redux-persist/lib/storage';
    import immutableTransform from 'redux-persist-transform-immutable';
    import { Application } from '../modules/application/records/application';
    import rootReducer from '../modules/reducers';
    
    const persistConfig = {
      transforms: [immutableTransform()],
      key: 'root',
      whitelist: 'application',
      storage,
    };
    
    const history = createHistory();
    const reduxRouterMiddleware = routerMiddleware(history);
    
    const reducer = combineReducers({
      ...rootReducer,
      routing: routerReducer,
    });
    
    const persistedReducer = persistReducer(persistConfig, reducer);
    
    const createStoreWithMiddleware = compose(
      applyMiddleware(thunkMiddleware, reduxRouterMiddleware, createLogger()),
    
      window.devToolsExtension ? window.devToolsExtension({ trace: true }) : f => f,
    )(createStore);
    
    export default function configureStore(initialState) {
      const store = createStoreWithMiddleware(persistedReducer, initialState);
    
      // reduxRouterMiddleware.listenForReplays(store);
    
      if (module.hot) {
        // Enable Webpack hot module replacement for reducers
        module.hot.accept('../modules/reducers', () => {
          const nextRootReducer = require('../modules/reducers');
          store.replaceReducer(nextRootReducer);
        });
      }
      const persister = persistStore(store);
      return { store, persister };
    }
    

    因为我在一个 React 项目中,所以我还需要更新我的路由以使用 PersistGate 元素:

    import React from 'react';
    import { render } from 'react-dom';
    import { BrowserRouter } from 'react-router-dom';
    import { Provider } from 'react-redux';
    
    import { PersistGate } from 'redux-persist/integration/react';
    
    import configureStore from './client/store/configureStore';
    
    const { store, persister } = configureStore();
    const { dispatch } = store;
    
    render(
      <Provider store={store}>
        <PersistGate loading={null} persistor={persister}>
          <BrowserRouter>
             {Routes here...}
          </BrowserRouter>
        </PersistGate>
      </Provider>,
      document.getElementById('root'),
    );
    
    dispatch(actions.initializeApp());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-24
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      相关资源
      最近更新 更多