Как сохранить 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() ищет, если магазин уже создан, и возвращает его, в противном случае он создает новый магазин.

Для процедуры загрузки я думал, что-то вроде этого будет делать

  1. Загрузить JSON от пользователя и разобрать
  2. Очистите localForage (так как он перезапишет initalState)
  3. Воссоздайте хранилище, используя initialState из предоставленного пользователем файла.
  4. Вызовите 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 }
}
Другие вопросы по тегам