react中redux利用redux-persist数据持久化

16 篇文章 1 订阅
1 篇文章 0 订阅

前端数据需要存在本地,来避免多次请求,提高前端效率。可以选的有cookie,localstorage,localsession各中区别,主要的就是大小限制等
比如登录信息,管理系统的权限,菜单列表等,还是选择存localstorage/localsession吧。在每次请求到数据后都去调用一次localstorage.set()感觉也挺麻烦的,最好的就是redux里有了数据就直接自动放入localstorage里,于是用redux-persist

npm install redux-persist --save

.babelrc 配置按需加载

 "plugins": [
    "transform-runtime", 
    ["import", { "libraryName": "redux-persist", "libraryDirectory": "es"}, "redux-persist"]
  ],

包装createReducer或者rootReducer

import { createStore, applyMiddleware } from 'redux';
import createSagaMiddleware, { END } from 'redux-saga';
// 返回的是combineReducers
import createReducer from '../reducers/index';
import  { persistReducer } from 'redux-persist';
import storage from 'redux-persist/es/storage'

const sagamiddleware = createSagaMiddleware();
// 数据对象
const storageConfig = {
    key: 'root', // 必须有的
    storage, // storage is now required
    blacklist: [] // reducer 里不持久化的数据
}

export default function configureStore(initStore = {}) {
    const middlewares = [sagamiddleware];
    const createStoreMiddleware = applyMiddleware(...middlewares)(createStore);
    const store = createStoreMiddleware(
        // 包装createReducer 即 rootReducer
        persistReducer(storageConfig, createReducer()), initStore
    );

    store.runSaga = sagamiddleware.run;
    store.close = () => store.dispatch(END);
    // 热重载
    if (module.hot) {
        module.hot.accept(() => {
            const nextRootReducer = require('../reducers/index').default;
            store.replaceReducer(persistReducer(storageConfig, createReducer(nextRootReducer)))
        }, )
    } 
    return store
}

再到app.js 入口文件中,利用PersistGate包裹根组建

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import rootSaga from './sagas/index';
import { persistStore } from 'redux-persist';
import { PersistGate } from 'redux-persist/es/integration/react';
import configureStore from "./store/configureStore";
import RootRoute from './router/rootRoute'; // 所有定义好的路由

const store = configureStore();
const persistor = persistStore(store);
store.runSaga(rootSaga);

const Loading = () => <div>loading</div>;

ReactDOM.render(
    <Provider store = {store} >
        <PersistGate loading={<Loading/>} persistor={persistor}>
            <RootRoute/>
        </PersistGate>
    </Provider>, 
    document.getElementById('root')
); 

登录后返回信息保存到localstorage里
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Redux Toolkit的数据持久化,你可以使用一些库或间件来帮助你完成这个任务。下面是一种常用的方法: 1. 使用redux-persist库:redux-persist是一个用于在Redux实现数据持久化的库。它提供了一个简单的方法来将Redux状态保存到本地存储(如LocalStorage或AsyncStorage),并在应用程序重新加载时还原状态。 首先,安装redux-persist库: ``` npm install redux-persist ``` 然后,在你的Redux store配置,使用`persistStore`函数来创建持久化的store: ```javascript import { configureStore } from '@reduxjs/toolkit'; import { persistStore, persistReducer } from 'redux-persist'; import storage from 'redux-persist/lib/storage'; // 默认使用LocalStorage import rootReducer from './reducers'; const persistConfig = { key: 'root', storage, }; const persistedReducer = persistReducer(persistConfig, rootReducer); export const store = configureStore({ reducer: persistedReducer, }); export const persistor = persistStore(store); ``` 这里,`persistConfig`对象用于配置持久化设置。你可以指定一个键(key)和存储引擎(storage),它默认使用LocalStorage。然后,使用`persistReducer`函数将根reducer与配置一起包装,创建一个持久化的reducer。 最后,通过调用`persistStore`函数来创建一个持久化的store,并导出store和persistor。 2. 在根组件使用`PersistGate`组件:`PersistGate`是redux-persist提供的一个React组件,用于在应用程序加载时等待持久化恢复完成。在根组件使用`PersistGate`包裹你的应用程序组件,并传入`persistor`作为prop。 ```javascript import { PersistGate } from 'redux-persist/integration/react'; import { persistor } from './store'; ReactDOM.render( <Provider store={store}> <PersistGate loading={null} persistor={persistor}> <App /> </PersistGate> </Provider>, document.getElementById('root') ); ``` 这样,当你的应用程序重新加载时,Redux状态将从本地存储恢复。 请注意,这只是一种实现Redux Toolkit数据持久化的方法之一,你也可以使用其他类似的库或间件来实现类似的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值