Synchronizowanie stanu z localStorage
Proszę utworzyć niestandardowy hook useLocalStorage, który dwukierunkowo synchronizuje stan React z localStorage.
Synchronizowanie stanu z localStorage to bezpłatna lekcja React Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.
Naiwne podejście prowadzi do rozbieżności
Pierwszym odruchem może być odczytywanie localStorage w jednym miejscu i zapisywanie go w innym, ale te dwa miejsca mogą zacząć działać niespójnie. Aktualizacje stanu, przy których zapomniano o zapisie, lub zapisane wartości, które nie są odzwierciedlone w stanie, prowadzą do błędów.
Potrzebne jest jedno źródło prawdy, które utrzymuje stan Reacta i magazyn danych w ścisłej synchronizacji.
Własny hook useLocalStorage
Przejrzystym rozwiązaniem jest hook useLocalStorage, który opakowuje useState i automatycznie utrwala zmiany. Zwraca on wartość oraz setter, podobnie jak useState.
Komponenty korzystają z niego dokładnie tak jak ze zwykłego stanu, ale otrzymują trwałość danych bez dodatkowego kodu.
Funkcja leniwej inicjalizacji
Odczyt localStorage jest operacją synchroniczną, dlatego nie należy wykonywać go przy każdym renderowaniu. Należy przekazać funkcję do useState, czyli funkcję leniwej inicjalizacji, aby odczyt nastąpił tylko raz podczas montowania komponentu.
Wewnątrz tej funkcji należy sparsować zapisaną wartość albo zwrócić podaną wartość domyślną.
Dlaczego leniwa inicjalizacja ma znaczenie
Jeśli początkowy stan zostanie obliczony bezpośrednio jako argument, to wyrażenie będzie wykonywane przy każdym renderowaniu, mimo że po pierwszym renderowaniu jego wynik jest ignorowany. W przypadku funkcji React wywołuje ją tylko raz.
W przypadku odczytów z localStorage pozwala to uniknąć powtarzania synchronicznych operacji w wątku głównym przy każdym renderowaniu.
Synchronizacja za pomocą useEffect
Aby utrwalać aktualizacje, należy dodać useEffect, który uruchamia się za każdym razem, gdy zmienia się wartość, i wywołuje localStorage.setItem(key, JSON.stringify(value)).
Umieszczenie wartości w tablicy zależności sprawia, że każda zmiana stanu jest automatycznie zapisywana w magazynie.
Aktualizacje funkcyjne zapobiegają nieaktualnym domknięciom
Podczas ustawiania wartości na podstawie poprzedniej wartości należy użyć formy funkcyjnej setValue(prev => prev + 1). Zapobiega to problemowi nieaktualnych domknięć, w których zapisywana byłaby stara przechwycona wartość.
Jest to szczególnie ważne w procedurach obsługi zdarzeń i efektach, które mogą przechwycić nieaktualny stan.
Obsługa wartości null w magazynie
getItem zwraca null, gdy dany klucz nie istnieje. Funkcja inicjalizująca musi to wykryć i użyć wartości domyślnej zamiast próbować parsować wartość null.
Warunek taki jak stored != null ? JSON.parse(stored) : defaultValue poprawnie obsługuje pierwszą wizytę.
Generyki TypeScript
W TypeScript można uczynić hook generycznym: function useLocalStorage<T>(key: string, initial: T). Zachowuje to typ wartości, dzięki czemu komponenty korzystające z hooka otrzymują pełne bezpieczeństwo typów.
Zwracana krotka ma typ [T, Dispatch<SetStateAction<T>>], zgodny z useState.
Wersjonowanie przechowywanych danych
Z czasem kształt danych ulega zmianie, a stare zapisane wartości mogą powodować błędy w nowym kodzie. Należy przechowywać klucz wersji obok danych, aby można było wykrywać nieaktualne formaty.
Na przykład można zapisać { version: 2, data } i porównać wersję podczas odczytu.
Usuwanie danych po niezgodności wersji
Gdy zapisana wersja nie odpowiada bieżącej, należy odrzucić starą wartość lub przeprowadzić jej migrację, zamiast jej ufać. Najprostsza strategia polega na usunięciu nieaktualnego wpisu i użyciu wartości domyślnych.
Zapobiega to awariom powodowanym przez dane zapisane przez starszą wersję aplikacji.
Złożenie hooka w całość
Kompletny hook useLocalStorage łączy funkcję leniwej inicjalizacji, która bezpiecznie odczytuje i parsuje dane, setter obsługujący aktualizacje funkcyjne oraz useEffect, który zapisuje dane z uwzględnieniem wersjonowania.
W rezultacie otrzymujemy bezpośredni zamiennik useState, który zachowuje dane po ponownym załadowaniu strony.
Sprawdzenie wiedzy
Sprawdź swoją wiedzę na temat inicjalizacji stanu.
Podsumowanie
Nauczyłeś się tworzyć hook useLocalStorage z funkcją leniwej inicjalizacji, utrwalać zmiany za pomocą useEffect, używać aktualizacji funkcyjnych w celu uniknięcia nieaktualnych domknięć oraz obsługiwać wartości null.
Poznałeś również generyki TypeScript i wersjonowanie, które pozwalają bezpiecznie usuwać nieaktualne dane.
Często zadawane pytania
Czy lekcja „Synchronizowanie stanu z localStorage” jest bezpłatna?
Tak — pełny tekst „Synchronizowanie stanu z localStorage” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Synchronizowanie stanu z localStorage”?
Proszę utworzyć niestandardowy hook useLocalStorage, który dwukierunkowo synchronizuje stan React z localStorage. Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć React Academy?
Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Synchronizowanie stanu z localStorage”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?
Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Odczytywanie i zapisywanie w localStorage w React
- Synchronizowanie stanu z localStorage
- Obsługa zdarzeń pamięci między kartami
- sessionStorage, IndexedDB i wybór właściwego API