详细讲一下React中Redux的持久化存储(Redux-persist)

1.安装依赖:

javascript 复制代码
npm install redux-persist

2. 基础配置:

javascript 复制代码
// store.js
import { configureStore } from '@reduxjs/toolkit'
import { persistStore, persistReducer } from 'redux-persist'
import storage from 'redux-persist/lib/storage' // 默认是 localStorage

// 持久化配置
const persistConfig = {
    key: 'root',        // 存储的键名
    storage,           // 存储方式
    whitelist: ['user', 'settings'],  // 需要持久化的reducer
    blacklist: ['temp'] // 不需要持久化的reducer
}

// 包装 reducer
const persistedReducer = persistReducer(persistConfig, rootReducer)

// 创建 store
export const store = configureStore({
    reducer: persistedReducer,
    middleware: (getDefaultMiddleware) =>
        getDefaultMiddleware({
            serializableCheck: {
                // 忽略 redux-persist 的动作类型
                ignoredActions: ['persist/PERSIST']
            }
        })
})

// 创建持久化 store
export const persistor = persistStore(store)

3.在应用中使用:

javascript 复制代码
// App.jsx
import { Provider } from 'react-redux'
import { PersistGate } from 'redux-persist/integration/react'
import { store, persistor } from './store'

function App() {
    return (
        <Provider store={store}>
            <PersistGate loading={null} persistor={persistor}>
                <YourApp />
            </PersistGate>
        </Provider>
    )
}

4.高级配置:

javascript 复制代码
const persistConfig = {
    key: 'root',
    storage,
    // 数据转换
    transforms: [
        encryptTransform({
            secretKey: 'my-secret-key'
        })
    ],
    // 存储版本控制
    version: 1,
    migrate: (state) => {
        // 版本迁移逻辑
        return Promise.resolve(state)
    },
    // 合并策略
    stateReconciler: autoMergeLevel2
}

5.自定义存储引擎:

javascript 复制代码
// 使用 sessionStorage
import createWebStorage from 'redux-persist/lib/storage/createWebStorage'
const sessionStorage = createWebStorage('session')

// 使用 AsyncStorage (React Native)
import AsyncStorage from '@react-native-async-storage/async-storage'

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

6.选择性持久化:

javascript 复制代码
// 单独配置某个 reducer
const userPersistConfig = {
    key: 'user',
    storage,
    whitelist: ['profile', 'preferences']
}

const userReducer = persistReducer(userPersistConfig, baseUserReducer)

// 在 store 中使用
const store = configureStore({
    reducer: {
        user: userReducer,
        other: otherReducer
    }
})

7.处理持久化状态:

javascript 复制代码
// 监听持久化状态
persistStore(store, null, () => {
    console.log('重置完成')
}).purge() // 清除持久化数据

// 在组件中使用
function App() {
    return (
        <PersistGate 
            loading={<LoadingView />}
            persistor={persistor}
            onBeforeLift={() => {
                // 在恢复数据之前执行
            }}
        >
            <YourApp />
        </PersistGate>
    )
}

8.实际应用示例:

javascript 复制代码
// userSlice.js
import { createSlice } from '@reduxjs/toolkit'

const userSlice = createSlice({
    name: 'user',
    initialState: {
        profile: null,
        token: null
    },
    reducers: {
        setUser: (state, action) => {
            state.profile = action.payload
        },
        setToken: (state, action) => {
            state.token = action.payload
        },
        logout: (state) => {
            state.profile = null
            state.token = null
        }
    }
})

// store.js
const persistConfig = {
    key: 'user',
    storage,
    whitelist: ['token'] // 只持久化 token
}

const persistedUserReducer = persistReducer(
    persistConfig,
    userSlice.reducer
)

// 使用
function App() {
    const dispatch = useDispatch()
    const token = useSelector(state => state.user.token)
    
    useEffect(() => {
        if (token) {
            // 自动登录逻辑
        }
    }, [token])
    
    return (
        // ...
    )
}

主要功能:

  • 自动保存状态到存储
  • 应用启动时恢复状态
  • 选择性持久化
  • 版本控制和迁移
  • 自定义存储引擎
  • 数据转换

使用场景:

  1. 用户登录状态
  • 应用配置
  • 主题设置
  • 缓存数据
  • 离线功能

注意事项:

  • 不要持久化敏感信息
  • 控制持久化数据大小
  • 处理版本升级
  • 考虑清理策略
  • 处理错误情况
相关推荐
hedley(●'◡'●)5 分钟前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_8115175157 分钟前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育8 分钟前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
百锦再8 分钟前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
CappuccinoRose34 分钟前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
这儿有一堆花40 分钟前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
NCDS程序员1 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
夏幻灵2 小时前
CSS三大特性:层叠、继承与优先级解析
前端·css
小杨同学呀呀呀呀2 小时前
Ant Design Vue <a-timeline>时间轴组件失效解决方案
前端·javascript·vue.js·typescript·anti-design-vue