详细讲一下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. 用户登录状态
  • 应用配置
  • 主题设置
  • 缓存数据
  • 离线功能

注意事项:

  • 不要持久化敏感信息
  • 控制持久化数据大小
  • 处理版本升级
  • 考虑清理策略
  • 处理错误情况
相关推荐
明月看潮生3 分钟前
青少年编程与数学 02-006 前端开发框架VUE 08课题、列表渲染
前端·javascript·vue.js·青少年编程·编程与数学
hawk2014bj5 分钟前
Vue3 中的插槽
前端·javascript·vue.js
有心还是可以做到的嘛10 分钟前
Vue3中的watch函数
前端·javascript·vue.js
三天不学习10 分钟前
Vue Router v3.x 迁移到 v4.x(两者的区别)【路由篇】
前端·javascript·vue.js·router
大G哥14 分钟前
Tailwind CSS 实战:深色模式设计与实现
前端·css
古怪今人20 分钟前
前端同步发送HTTP请求 Ajax、Fetch和Axios实现HTTP同步请求
前端·http·ajax
时间sk27 分钟前
CSS——9.ID选择器
前端·javascript·css
_Jyann_30 分钟前
css如何选择元素的最后一个并设置样式
前端·javascript·css
开心工作室_kaic1 小时前
springboot571基于协同过滤算法的私人诊所管理系统(论文+源码)_kaic
前端·数据库·vue.js·后端·html5
✎﹏ℳ๓₯㎕1 小时前
vue使用keep-alive实现页面前进刷新,后退缓存
前端·vue.js·缓存