代码之家  ›  专栏  ›  技术社区  ›  David Polák

如何将Redux存储保存为下载的文件,然后将其加载回?

  •  1
  • David Polák  · 技术社区  · 6 年前

    我有一个网络应用程序,它有一个项目的概念。我正在使用 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() 查找是否已经创建了存储并返回它,否则它将创建一个新的存储。

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

    1. 清除localfour(因为它会覆盖initalState)
    2. 使用用户提交的文件中的initialState重新创建存储
    3. 再次调用ReactDOM.render()

    有没有更好的方法,也许是内置的加载方法 redux redux-persist 我在文件里漏掉了?

    1 回复  |  直到 6 年前
        1
  •  0
  •   David Polák    6 年前

    这就是我如何解决它的,它不是最优雅的,需要在商店重新加载时注册回调,但它是有效的。

    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 }
    }