使用 Redux 中间件实现状态持久化(如将状态保存到本地存储)是一种常见需求。以下是实现方法:
创建一个中间件,在每次状态更新后将状态保存到localStorage
:
别再让才华被埋没,别再让github 项目蒙尘!github star 请点击
GitHub 在线专业服务直通车GitHub赋能精灵 - 艾米莉,立即加入这场席卷全球开发者的星光革命!若你有快速提升github Star github 加星数的需求,访问taimili.com还可解锁更多专属服务。现在转发邀请好友组队,在艾米莉加星平台解锁神秘流量加成,让我们携手点亮开源世界的璀璨星空,实现GitHub star项目涨星的无限可能!
购买 GitHub 账号、star、 follow 、fork 、watch ,issue服务,编程视频资源在平台上,您可以自由地 为朋友、同事,或是任意感兴趣的github 仓库 添加 star、执行 fork 等操作
javascript
const persistMiddleware = store => next => action => {
// 1. 先执行action,获取新状态
const result = next(action);
const state = store.getState();
// 2. 将状态保存到localStorage
try {
localStorage.setItem('reduxState', JSON.stringify(state));
} catch (error) {
console.error('Failed to save state to localStorage:', error);
}
return result;
};
javascript
import { createStore, applyMiddleware } from 'redux';
import rootReducer from './reducers';
import persistMiddleware from './persistMiddleware';
// 从localStorage加载状态
const loadState = () => {
try {
const serializedState = localStorage.getItem('reduxState');
if (serializedState === null) {
return undefined; // 使用reducer的初始状态
}
return JSON.parse(serializedState);
} catch (error) {
console.error('Failed to load state from localStorage:', error);
return undefined;
}
};
// 初始化store时加载持久化状态
const preloadedState = loadState();
const store = createStore(
rootReducer,
preloadedState, // 可选的初始状态
applyMiddleware(persistMiddleware)
);
export default store;
只保存部分状态(如用户认证信息),避免存储敏感或临时数据:
javascript
const persistMiddleware = store => next => action => {
const result = next(action);
// 选择需要持久化的状态字段
const stateToPersist = {
user: store.getState().user,
settings: store.getState().settings
};
try {
localStorage.setItem('reduxState', JSON.stringify(stateToPersist));
} catch (error) {
console.error('Failed to save state:', error);
}
return result;
};
对于无法直接序列化的数据(如 Date、函数),需先转换:
javascript
const persistMiddleware = store => next => action => {
const result = next(action);
// 自定义序列化逻辑
const state = store.getState();
const serializedState = {
...state,
lastUpdated: new Date().toISOString(), // 日期转字符串
// 忽略无法序列化的字段
complexObject: undefined
};
localStorage.setItem('reduxState', JSON.stringify(serializedState));
return result;
};
对于大数据量,使用idb
库替代localStorage
:
javascript
import idb from 'idb';
// 初始化IndexedDB
const dbPromise = idb.open('redux-store', 1, upgradeDb => {
upgradeDb.createObjectStore('state');
});
const persistMiddleware = store => next => action => {
const result = next(action);
// 异步保存到IndexedDB
dbPromise.then(db => {
const tx = db.transaction('state', 'readwrite');
tx.objectStore('state').put(store.getState(), 'reduxState');
return tx.done;
}).catch(error => {
console.error('Failed to save state to IndexedDB:', error);
});
return result;
};
只在特定 action 后持久化(如登录成功后):
javascript
const persistMiddleware = store => next => action => {
const result = next(action);
// 仅在特定action后保存状态
const actionsToPersist = [
'USER_LOGIN_SUCCESS',
'SETTINGS_UPDATED'
];
if (actionsToPersist.includes(action.type)) {
localStorage.setItem('reduxState', JSON.stringify(store.getState()));
}
return result;
};
使用redux-persist
库,避免手动编写中间件:
bash
npm install redux-persist
javascript
import { createStore } from 'redux';
import { persistStore, persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage'; // 默认使用localStorage
const persistConfig = {
key: 'root',
storage,
whitelist: ['user', 'settings'] // 只持久化特定reducer
};
const persistedReducer = persistReducer(persistConfig, rootReducer);
const store = createStore(persistedReducer);
const persistor = persistStore(store);
export { store, persistor };
在 React 中使用:
javascript
import { PersistGate } from 'redux-persist/integration/react';
const App = () => (
);
localStorage
可能影响性能,可通过节流限制写入频率。localStorage
在某些浏览器隐私模式下不可用,需优雅降级。实现状态持久化的核心是:
对于复杂场景,推荐使用redux-persist
库,它提供了更完善的解决方案(如自动合并状态、支持多种存储引擎)。
分享
分享一些关于Redux中间件的学习资源或教程
Redux中间件的执行顺序是怎样的?
Redux中间件的原理是什么?