Как сохранить дерево состояний redux при обновлении?
первый принцип документации Redux:
состояние всего приложения хранится в дереве объектов в одном хранилище.
и я действительно думал, что хорошо понимаю всех директоров. Но теперь я смущен тем, что означает приложение.
Если приложение означает только одну из небольших сложных частей на веб-сайте и работает всего на одной странице, Я понимаю. Но что, если приложение означает весь сайт? Я Должен использовать LocalStorage или cookie или что-то еще для сохранения дерева состояний? но что делать, если браузер не поддерживает LocalStorage?
Я хочу знать, как разработчики сохраняют свое дерево состояний! :)
3 ответов
Если вы хотите сохранить состояние redux в обновлении браузера, лучше всего сделать это с помощью промежуточного по redux. Проверьте redux-persist и redux-хранение промежуточное. Они оба пытаются выполнить одну и ту же задачу хранения состояния redux, чтобы его можно было сохранить и загрузить по желанию.
хотя ответ был действителен в какой-то момент важно заметить, что redux-хранение пакет был устаревшим, и он больше не поддерживается...
оригинальный автор пакета redux-storage решил отказаться от проекта и больше не поддерживается.
теперь, если вы не хотите иметь зависимости от других пакетов, чтобы избежать подобных проблем в будущем очень легко катить собственное решение.
все, что вам нужно сделать, это:
1-Создайте функцию, которая возвращает состояние из localStorage
а затем передать состояние в createStore
функция redux во втором параметре, чтобы увлажнить магазин
const store = createStore(appReducers, state);
2-Слушайте изменения состояния и каждый раз, когда состояние изменяется, сохраните состояние в localStorage
store.subscribe(() => {
//this is just a function that saves state to localStorage
saveState(store.getState());
});
и это все...Я действительно использую что-то подобное в производстве, но вместо использования функций я написал очень простой класс, как показано ниже...
class StateLoader {
loadState() {
try {
let serializedState = localStorage.getItem("http://contoso.com:state");
if (serializedState === null) {
return this.initializeState();
}
return JSON.parse(serializedState);
}
catch (err) {
return this.initializeState();
}
}
saveState(state) {
try {
let serializedState = JSON.stringify(state);
localStorage.setItem("http://contoso.com:state", serializedState);
}
catch (err) {
}
}
initializeState() {
return {
//state object
}
};
}
}
а затем при загрузке вашего приложения...
import StateLoader from "./state.loader"
const stateLoader = new StateLoader();
let store = createStore(appReducers, stateLoader.loadState());
store.subscribe(() => {
stateLoader.saveState(store.getState());
});
надеюсь, что это поможет кому-то
Примечание По Производительности
если изменения состояния очень часты в вашем приложении, сохранение в локальное хранилище слишком часто может повредить производительности вашего приложения, особенно если график состояния объекта для сериализации / десериализации большой. В этих случаях может потребоваться отменить или отключить функцию, которая сохраняет состояние localStorage с помощью RxJs
, lodash
или что-то подобное.
исходный вопрос
Я хочу знать, как разработчики сохраняют свое дерево состояний! :)
Ну, так как я не вижу этого ответа, и вы использовали метку React; часто React webapps реализованы как SPA (одностраничное приложение), что не обновите браузер. Они могут сделать это!--9-->похоже, что это так изменив URL-адрес, который вы видите в адресной строке. Популярный способ сделать это react-router
.
но все же состояние SPA не выдерживает обновления браузера, так что когда redux-persist
приходит.