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

注意事项:

  • 不要持久化敏感信息
  • 控制持久化数据大小
  • 处理版本升级
  • 考虑清理策略
  • 处理错误情况
相关推荐
uhakadotcom24 分钟前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom28 分钟前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom29 分钟前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom38 分钟前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom1 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试
LaoZhangAI2 小时前
2025最全GPT-4o图像生成API指南:官方接口配置+15个实用提示词【保姆级教程】
前端
ONE_Gua2 小时前
chromium魔改——CDP(Chrome DevTools Protocol)检测01
前端·后端·爬虫
LaoZhangAI2 小时前
2025最全Cherry Studio使用MCP指南:8种强大工具配置方法与实战案例
前端
咖啡教室2 小时前
前端开发日常工作每日记录笔记(2019至2024合集)
前端·javascript
溪饱鱼2 小时前
Nuxt3能上生产吗?
前端