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

注意事项:

  • 不要持久化敏感信息
  • 控制持久化数据大小
  • 处理版本升级
  • 考虑清理策略
  • 处理错误情况
相关推荐
雪碧聊技术5 小时前
前端项目代码发生改变,如何重新部署到linux服务器?
前端·vue3·centos7·代码更新,重新部署
liulilittle5 小时前
C++ 浮点数封装。
linux·服务器·开发语言·前端·网络·数据库·c++
wordbaby5 小时前
Expo 进阶指南:赋予 TanStack Query “原生感知力” —— 深度解析 AppState 与 NetInfo
前端·react native
Moment5 小时前
从美团全栈化看 AI 冲击:前端转全栈,是自救还是必然 🤔🤔🤔
前端·后端·面试
天问一5 小时前
使用 Vue Router 进行路由定制和调用的示例
前端·javascript·vue.js
韩立学长7 小时前
【开题答辩实录分享】以《基于Vue的非遗文化知识分享平台的设计与实现》为例进行选题答辩实录分享
前端·javascript·vue.js
优弧7 小时前
离开舒适区100天,我后悔了吗?
前端·后端·面试
胡gh7 小时前
css的臂膀,前端动效的利器,还是布局的“隐形陷阱”?
前端·css·html
灵感菇_7 小时前
Flutter Riverpod 完整教程:从入门到实战
前端·flutter·ui·状态管理
用户21411832636027 小时前
紧急修复!Dify CVE-2025-55182 高危漏洞,手把手教你升级避坑
前端