美文网首页
redux-persist

redux-persist

作者: 隐号骑士 | 来源:发表于2020-05-08 14:25 被阅读0次

前端应用,状态信息可以存储在:

  • 1 应用内部(eg:state 、redux)
  • 2 URL
  • 3 缓存(localStorage/seesionStorage)

在使用SPA框架开发时,通常尽量采用上述第一种方式以符合框架设计者的意图,方便状态管理。
然而,有时产品会有这样的需求:刷新页面时不改变某些状态(如id),此时可能考虑使用URL进行辅助的存储。
然而,产品说刷新时不止id不变,整个页面的状态都不可以改变,用URL存这么复杂的状态,会遇到长度限制和管理混乱的问题。
于是,考虑使用上述第三种方式。
自己实现的话思路大概是:

  • 修改redux中的监听器,当有状态更新时同步到缓存
  • 修改应用最外层组件,在挂载时读取缓存,如果有,读取后手动触发redux状态更新

redux-persist是一个实现redux状态持久化的库。下面在介绍它在umi.js中的使用。

首先安装依赖,由于umi和redux-persist在各个大版本区别较大,读者尝试时请注意对应版本:

//package.json
    "umi": "2.13.1",
    "umi-plugin-react": "1.15.1",
    "redux-persist": "^5.10.0"

添加src/app.js:

import { persistStore, persistReducer } from 'redux-persist';
import storage from 'redux-persist/es/storage/session';

const persistConfig = {
    timeout: 1000, // you can define your time. But is required.
    key: 'root',
    storage,
};

const persistEnhancer = () => createStore => (reducer, initialState, enhancer) => {
    const store = createStore(persistReducer(persistConfig, reducer), initialState, enhancer);
    const persist = persistStore(store, null);
    return {
        persist,
        ...store,
    };
};
export const dva =
    process.env.APP_TYPE === 'build'
        ? {
              config: {
                  extraEnhancers: [persistEnhancer()],
              },
          }
        : {
              config: {
                  extraEnhancers: [persistEnhancer()],
              },
              plugins: [
                  {
                      // onAction: createLogger(),
                  },
              ],
          };

修改最外层组件,本例中是BasicLayout.js:

//...
import { PersistGate } from 'redux-persist/integration/react';
//...
return (
            <React.Fragment>
                <PersistGate persistor={window.g_app._store.persist} loading={null}>
                    <DocumentTitle title="">
                        <ContainerQuery query={query}>
                            {params => (
                                <Context.Provider value={this.getContext()}>
                                    <ConfigProvider locale={zhCN}>
                                        <div className={classNames(params)}>{layout}</div>
                                    </ConfigProvider>
                                </Context.Provider>
                            )}
                        </ContainerQuery>
                    </DocumentTitle>
                    <Suspense fallback={<PageLoading />} />
                </PersistGate>
            </React.Fragment>
        );
//...

现在刷新浏览器试试吧?

相关文章

  • Redux实践(1)

    redux 新的尝试 normalizr redux-actions redux-persist redux-th...

  • react简单使用react-redux步骤

    1、引入react-redux,redux, redux-thunk, redux-persist npm...

  • redux-persist

    当进入需要登录才能访问的页面检查 user 是否存在,如果不存在优先在本地存储中获取。如果只有一两个状态需要持久化...

  • redux-persist

    前端应用,状态信息可以存储在: 1 应用内部(eg:state 、redux) 2 URL 3 缓存(localS...

  • redux-persist

    基础使用 牵扯到 persistStore persistReducer 两个 API。 persistStore...

  • Redux Persist 最佳实践

    Redux Persist 最佳实践 希望可以帮助大家使用和了解redux-persist的相关能力 接入 npm...

  • 浅析redux-persist

    之前在项目中遇到redux的数据持久化问题,当页面刷新时,redux中存储的状态会重置,导致之前的操作无效,这要是...

  • qiankun踩坑记录

    问题一 主应用和子应用的redux,都加上redux-persist后,redux-store冲突,子应用的red...

  • redux-persist V5

    在创建redux store 时, 将persistReducer包装应用的rootReducer,然后传递给cr...

  • redux数据持久化好帮手:redux-persist

    前言 web数据持久化最经典的场景莫过于登录态了。用户登录网站后,应该保留一断时间的登录态。一般来说,我们会将用户...

网友评论

      本文标题:redux-persist

      本文链接:https://www.haomeiwen.com/subject/hwrfnhtx.html