如何使用redux-persist进行redux数据持久化?

redux 是如何保存状态数据的?

我们使用了 redux 后,多个页面的状态可以方便的集中管理,还被动实现了状态的跨组件和跨页面共享。

redux 是怎么做到的呢?答案是内存,redux 将状态数据保存在了内存里。

因为是保存在内存里,所以当我们刷新页面时,这些状态数据就没了,需要重新去获取。

通过网络请求重新获取状态数据,会有时延的问题,体验不好还浪费服务器资源。

怎么办?

我们可以把状态数据保存在本地(LS,SS 等),只在需要刷新数据的时候才去使用网络请求。

redux-persist 就是这样的一个库,它是一个状态数据的本地化解决方案。如果项目不大,你自己去操作 localstorage,但是如果涉及的数据比较多,redux-persist 会让你轻松很多。

安装

yarn add redux-persist

使用

import { useEffect } from 'react';
import { createStore, applyMiddleware } from 'redux';
import { Provider } from 'react-redux';
import { createLogger } from 'redux-logger';
import thunk from 'redux-thunk';
import { useLocation } from 'react-router-dom';

import { persistStore, persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage'; // defaults to localStorage for web
import { PersistGate } from 'redux-persist/integration/react';

import reducer from '@reducers';

const middleware = [thunk];
if (process.env.NODE_ENV !== 'production') {
  middleware.push(createLogger());
}

const persistConfig = {
  key: 'root',
  storage,
};

const persistedReducer = persistReducer(persistConfig, reducer);

let store = createStore(persistedReducer, applyMiddleware(...middleware));

let persistor = persistStore(store);

function Layout(props) {
  const { pathname } = useLocation();

  useEffect(() => {
    window.scrollTo(0, 0);
  }, [pathname]);

  return (
    <Provider store={store}>
      <PersistGate loading={null} persistor={persistor}>
        {props.children}
      </PersistGate>
    </Provider>
  );
}

export default Layout;

上面的代码集成了 redux-logger 和 redux-thunk,以及跨页面的滚动条回到页面顶部。是我在重构 m.yuancheng.work 项目使用的真实业务代码。

© 2022  Arvin Xiang
Built with ❤️ by myself