如何将 Redux Store 保存为下载文件,然后加载回来?
How to save Redux Store as a downloaded file and then load it back?
我有一个具有项目概念的网络应用程序。我正在使用 react
、react-redux
和 react-persist
以及 localForage
作为持久目标。
我现在正在尝试实现项目保存和项目加载功能,整个Redux State作为一个项目文件。项目文件应作为用户下载保存到磁盘。 And/or 任何云文件存储服务。
保存部分是微不足道的,只需获取商店,序列化为 JSON,然后将其提供给用户下载。
加载有点棘手,我的 ReactDOM.render
很正常。
const {store, persistor} = configureStore()
ReactDOM.render(
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
<Router>
<Route path={`${process.env.PATH}/`} component={App} />
</Router>
</PersistGate>
</Provider>,
document.getElementById('app')
)
configureStore()
查找是否已经创建了一个商店,returns 它,否则它创建一个新商店。
对于加载过程,我想这样就可以了
- 从用户加载 JSON 并解析
- 清除 localForage(因为它会覆盖 initalState)
- 使用用户提交文件中的 initialState 重新创建商店
- 再次调用 ReactDOM.render()
是否有更好的方法,也许是我在文档中遗漏的 redux
和 redux-persist
的内置加载方法?
这就是我解决它的方法,它不是最优雅的并且需要在商店重新加载时注册回调,但它有效。
const createNewStore = (initialState = undefined) => {
const persistConfig = { key: 'root', storage: localForage }
store = createStore(
persistReducer(persistConfig, reducers),
initialState,
createMiddleware()
)
persistor = persistStore(store)
}
const loadState = (state) => {
createNewStore(state)
callbacks.forEach(callback => {
callback()
})
}
export const loadStore = (json) => {
return new Promise((resolve, reject) => {
let state
try {
state = JSON.parse(json)
} catch (err) {
return reject(err)
}
if (!persistor) {
return resolve(loadState(state))
}
persistor.purge().then(() => {
return resolve(loadState(state))
}).catch(() => {
return resolve(loadState(state))
})
})
}
const getStore = (storeReplaceCallback = null) => {
if (storeReplaceCallback) {
callbacks.push(storeReplaceCallback)
}
if (!store) {
createNewStore()
}
return { store, persistor }
}
我有一个具有项目概念的网络应用程序。我正在使用 react
、react-redux
和 react-persist
以及 localForage
作为持久目标。
我现在正在尝试实现项目保存和项目加载功能,整个Redux State作为一个项目文件。项目文件应作为用户下载保存到磁盘。 And/or 任何云文件存储服务。
保存部分是微不足道的,只需获取商店,序列化为 JSON,然后将其提供给用户下载。
加载有点棘手,我的 ReactDOM.render
很正常。
const {store, persistor} = configureStore()
ReactDOM.render(
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
<Router>
<Route path={`${process.env.PATH}/`} component={App} />
</Router>
</PersistGate>
</Provider>,
document.getElementById('app')
)
configureStore()
查找是否已经创建了一个商店,returns 它,否则它创建一个新商店。
对于加载过程,我想这样就可以了
- 从用户加载 JSON 并解析
- 清除 localForage(因为它会覆盖 initalState)
- 使用用户提交文件中的 initialState 重新创建商店
- 再次调用 ReactDOM.render()
是否有更好的方法,也许是我在文档中遗漏的 redux
和 redux-persist
的内置加载方法?
这就是我解决它的方法,它不是最优雅的并且需要在商店重新加载时注册回调,但它有效。
const createNewStore = (initialState = undefined) => {
const persistConfig = { key: 'root', storage: localForage }
store = createStore(
persistReducer(persistConfig, reducers),
initialState,
createMiddleware()
)
persistor = persistStore(store)
}
const loadState = (state) => {
createNewStore(state)
callbacks.forEach(callback => {
callback()
})
}
export const loadStore = (json) => {
return new Promise((resolve, reject) => {
let state
try {
state = JSON.parse(json)
} catch (err) {
return reject(err)
}
if (!persistor) {
return resolve(loadState(state))
}
persistor.purge().then(() => {
return resolve(loadState(state))
}).catch(() => {
return resolve(loadState(state))
})
})
}
const getStore = (storeReplaceCallback = null) => {
if (storeReplaceCallback) {
callbacks.push(storeReplaceCallback)
}
if (!store) {
createNewStore()
}
return { store, persistor }
}