Как сохранить Redux Store как загруженный файл, а затем загрузить его обратно?
У меня есть веб-приложение, которое имеет представление о проектах. я использую react
, react-redux
а также react-persist
с localForage
как постоянная цель.
Сейчас я пытаюсь реализовать функцию сохранения проекта и загрузки проекта, и все состояние Redux служит файлом проекта. Файл проекта должен быть сохранен на диск для загрузки пользователем. И / или любой облачный сервис хранения файлов.
Часть сохранения тривиальна, просто возьмите магазин, сериализовайте в 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()
ищет, если магазин уже создан, и возвращает его, в противном случае он создает новый магазин.
Для процедуры загрузки я думал, что-то вроде этого будет делать
- Загрузить JSON от пользователя и разобрать
- Очистите localForage (так как он перезапишет initalState)
- Воссоздайте хранилище, используя initialState из предоставленного пользователем файла.
- Вызовите ReactDOM.render() снова
Есть ли лучший способ, возможно, встроенные методы загрузки в redux
а также redux-persist
что я пропустил в документах?
1 ответ
Вот как я это решил, это не самый элегантный и требует регистрации обратных вызовов при перезагрузке магазина, но это работает.
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 }
}