如何将 Redux Store 保存为下载文件,然后加载回来?

How to save Redux Store as a downloaded file and then load it back?

我有一个具有项目概念的网络应用程序。我正在使用 reactreact-reduxreact-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 它,否则它创建一个新商店。

对于加载过程,我想这样就可以了

  1. 从用户加载 JSON 并解析
  2. 清除 localForage(因为它会覆盖 initalState)
  3. 使用用户提交文件中的 initialState 重新创建商店
  4. 再次调用 ReactDOM.render()

是否有更好的方法,也许是我在文档中遗漏的 reduxredux-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 }
}