Edytuj 25 sierpnia 2019 r
Jak stwierdzono w jednym z komentarzy. Oryginalny pakiet Redux-Storage został przeniesiony do React -stack . To podejście nadal koncentruje się na wdrażaniu własnego rozwiązania do zarządzania stanem.
Oryginalna odpowiedź
Chociaż udzielona odpowiedź była prawidłowa w pewnym momencie, należy zauważyć, że oryginalny pakiet redux-storage został przestarzały i nie jest już obsługiwany ...
Oryginalny autor pakietu redux-storage zdecydował o wycofaniu projektu i zaprzestaniu jego obsługi.
Teraz, jeśli nie chcesz mieć zależności od innych pakietów, aby uniknąć takich problemów w przyszłości, bardzo łatwo jest stworzyć własne rozwiązanie.
Wystarczy, że:
1- Utwórz funkcję, która zwraca stan z, localStorage
a następnie przekazuje stan do createStore
funkcji redux w drugim parametrze w celu nawodnienia sklepu
const store = createStore(appReducers, state);
2- Nasłuchuj zmian stanu i za każdym razem, gdy stan się zmienia, zapisz stan localStorage
store.subscribe(() => {
saveState(store.getState());
});
I to wszystko ... Właściwie używam czegoś podobnego w produkcji, ale zamiast korzystać z funkcji napisałem bardzo prostą klasę jak poniżej ...
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 {
}
};
}
}
a następnie podczas ładowania aplikacji ...
import StateLoader from "./state.loader"
const stateLoader = new StateLoader();
let store = createStore(appReducers, stateLoader.loadState());
store.subscribe(() => {
stateLoader.saveState(store.getState());
});
Mam nadzieję, że to komuś pomoże
Uwaga dotycząca wydajności
Jeśli zmiany stanu są bardzo częste w aplikacji, zbyt częste zapisywanie w magazynie lokalnym może zaszkodzić wydajności aplikacji, zwłaszcza jeśli wykres obiektu stanu do serializacji / deserializacji jest duży. W takich przypadkach warto opóźnieniu na przepustnicy lub funkcję, która zapisuje stan na localStorage użyciu RxJs
, lodash
lub coś podobnego.