Chcę zachować niektóre części mojego drzewa stanu do localStorage. Jakie jest odpowiednie miejsce, aby to zrobić? Redukcja czy akcja?Gdzie pisać do localStorage w aplikacji Redux?
Odpowiedz
Reduktor nigdy nie jest odpowiednim miejscem do tego, ponieważ reduktory powinny być czyste i nie powodować efektów ubocznych.
Polecam po prostu robi to w abonenta:
store.subscribe(() => {
// persist your state
})
Przed utworzeniem sklepu, czytać te przetrwały części:
const persistedState = // ...
const store = createStore(reducer, persistedState)
Jeśli używasz combineReducers()
zauważysz, że reduktory że raj t otrzyma stan będzie "bootować" normalnie, używając domyślnej wartości argumentu state
. To może być bardzo przydatne.
Wskazane jest, aby porzucić subskrybenta, aby nie pisać zbyt szybko do localStorage lub wystąpią problemy z wydajnością.
Wreszcie, można utworzyć oprogramowanie pośrednie, które stanowi alternatywę, ale zacznę od subskrybenta, ponieważ jest to prostsze rozwiązanie i dobrze działa.
Jednym słowem: middleware.
Zapoznaj się z redux-persist. Lub napisz własny.
[UPDATE 18 gru 2016] Edytowane w celu usunięcia wzmianki o dwóch podobnych projektach, które są teraz nieaktywne lub przestarzałe.
W Mean Time Redux-storage również wydaje się być opuszczony. – Dani
Aby wypełnić formularz odpowiedzi Dan Abramov mógłby użyć store.subscribe()
takiego:
store.subscribe(()=>{
localStorage.setItem('reduxState', JSON.stringify(store.getState()))
})
Przed utworzeniem sklepu, sprawdź localStorage
i analizować każdą JSON pod klucz jak ten:
const persistedState = localStorage.getItem('reduxState') ? JSON.parse(localStorage.getItem('reduxState')) : {}
Następnie należy przekazać stałą peristedState
do metody createStore
w następujący sposób:
const store = createStore(
reducer,
persistedState,
/* any middleware... */
)
Proste i skuteczne, bez dodatkowych zależności. – AxeEffect
Tworzenie oprogramowania pośredniego może wyglądać nieco lepiej, ale zgadzam się, że jest ono skuteczne i wystarczające w większości przypadków. –
Czy jest to dobry sposób, aby to zrobić, gdy korzystasz z CombineReducers, a chcesz utrzymać tylko jeden sklep? – brendangibson
Jeśli ktoś ma jakikolwiek problem z powyższym, możesz napisać własne. Pozwól, że pokażę ci, co zrobiłem. Ignoruj: saga middleware
rzeczy koncentrują się na dwóch metodach: localStorageMiddleware
i reHydrateStore
. localStorageMiddleware
ciągnąć cały redux state
i umieszcza go w local storage
i rehydrateStore
ciągnąć cały applicationState
w pamięci lokalnej jeżeli są i umieszcza go w redux store
import {createStore, applyMiddleware} from 'redux'
import createSagaMiddleware from 'redux-saga';
import decoristReducers from '../reducers/decorist_reducer'
import sagas from '../sagas/sagas';
const sagaMiddleware = createSagaMiddleware();
/**
* Add all the state in local storage
* @param getState
* @returns {function(*): function(*=)}
*/
const localStorageMiddleware = ({getState}) => { // <--- FOCUS HERE
return (next) => (action) => {
const result = next(action);
localStorage.setItem('applicationState', JSON.stringify(
getState()
));
return result;
};
};
const reHydrateStore =() => { // <-- FOCUS HERE
if (localStorage.getItem('applicationState') !== null) {
return JSON.parse(localStorage.getItem('applicationState')) // re-hydrate the store
}
}
const store = createStore(
decoristReducers,
reHydrateStore(),// <-- FOCUS HERE
applyMiddleware(
sagaMiddleware,
localStorageMiddleware,// <-- FOCUS HERE
)
)
sagaMiddleware.run(sagas);
export default store;
- 1. Gdzie ustawić plik cookie w aplikacji Isomorphic Redux?
- 2. W MVP gdzie pisać sprawdzania poprawności
- 3. Dodawanie Redux do istniejącej aplikacji React
- 4. Przechowywanie obiektu "globalnego" poza sklepem Redux w aplikacji React/Redux
- 5. Pisanie do XML za pomocą XDocument, ale wiedząc, gdzie pisać
- 6. Wdrażanie aplikacji react-redux w AWS S3
- 7. Jak używać dekoratorów w aplikacji React Redux?
- 8. iPhone localstorage lifecycle - czy przetrwa aktualizację aplikacji?
- 9. Jak pisać testy dla mojej aplikacji internetowej?
- 10. dodawanie nowych obiektów do localstorage
- 11. Jak przechowywać tablicę w localStorage?
- 12. przechowywania obiektów w localStorage
- 13. Jaki jest sens normalizacji odpowiedzi na api w aplikacji Redux?
- 14. Możliwy problem z nawigacją w aplikacji React Native/Redux
- 15. Strategia udostępniania tokenu dostępu OAuth w aplikacji Redux
- 16. Jak pisać GUI w Pythonie?
- 17. Jak pisać do pliku w Ruby?
- 18. Jak pisać do pliku w .NET Core?
- 19. Jak pisać do konsoli debugowania w VB6?
- 20. Jak pisać do pamięci w programie Ext.js
- 21. Akcje asynchroniczne w Redux
- 22. Asynchroniczny stan początkowy React-Redux Redux-Thunk
- 23. Usuwanie danych z LocalStorage
- 24. Android localStorage zniknie po usunięciu aplikacji z pamięci RAM
- 25. Najlepsza praktyka do wielokrotnego użytku obliczenia danych w sklepie redux
- 26. LocalStorage i JSON.stringify JSON.parse
- 27. localStorage niewiarygodne w przeglądarce Firefox
- 28. localStorage nie działa w Edge?
- 29. Jak używać Redux do odświeżania tokena JWT?
- 30. Iphone localStorage "QUOTA_EXCEEDED_ERR" problem
co, jeśli chciałbym zapisać się do części państwa? czy to jest możliwe? Poszedłem do przodu z czymś nieco innym: 1. zachowaj stan nadmiarowy poza reduxem. 2. załaduj stan trwały wewnątrz konstruktora reagu (lub z componentWillMount) z działaniem redux. Czy 2 jest całkowicie poprawne zamiast bezpośredniego ładowania utrwalonych danych w sklepie? (które staram się zachować oddzielnie dla SSR). Przy okazji dziękuję za Redux! To niesamowite, uwielbiam to, po zagubieniu się z moim wielkim kodem projektu, teraz wszystko wróci do prostego i przewidywalnego :) –
w sklepie.zasubskrybuj oddzwonienie, masz pełny dostęp do bieżących danych sklepu, dzięki czemu możesz utrwalić każdą część, którą jesteś zainteresowany –
Dan Abramov zrobił także cały film na ten temat: https://egghead.io/lessons/javascript-redux- utrzymywanie stanu na lokalnym przechowywaniu – NateW