Obsługa zdarzeń pamięci między kartami
Proszę reagować na zmiany w localStorage w innych kartach przeglądarki za pomocą nasłuchiwania zdarzenia storage.
Obsługa zdarzeń pamięci między kartami to bezpłatna lekcja React Academy na CoddyKit. To lekcja 3 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.
Problem nieaktualnych danych między kartami
Gdy użytkownik ma aplikację otwartą w dwóch kartach i aktualizuje wartość w karcie A, karta B nadal wyświetla stary stan. Każda karta ma własny stan Reacta w pamięci, mimo że współdzielą localStorage.
Bez synchronizacji karty mają różne informacje o bieżącej wartości.
Zdarzenie storage jest wywoływane w innych kartach
Przeglądarka wysyła zdarzenie storage do innych kart tego samego origin za każdym razem, gdy zmieni się localStorage. Co ważne, zdarzenie nie jest wywoływane w karcie, która wprowadziła zmianę.
Jest to dokładnie sygnał, którego karta B potrzebuje, aby dowiedzieć się, że karta A zaktualizowała dane.
Nasłuchiwanie za pomocą addEventListener
Wewnątrz useEffect należy wywołać window.addEventListener('storage', handler) i zwrócić funkcję czyszczącą, która usuwa nasłuchiwanie. W ten sposób komponent subskrybuje zmiany między kartami.
Efekt powinien uruchomić się raz podczas montowania komponentu, dlatego odpowiednia będzie pusta lub stabilna tablica zależności.
Właściwości StorageEvent
Obiekt zdarzenia zawiera key (klucz, który się zmienił), oldValue i newValue (ciągi znaków odpowiednio sprzed zmiany i po niej) oraz storageArea (zmieniony obiekt magazynu).
Klucz null wraz z wartościami null oznacza, że cały magazyn został wyczyszczony.
Filtrowanie do własnych kluczy
Zdarzenie storage jest wywoływane dla każdego klucza w obrębie origin, dlatego procedura obsługi powinna sprawdzić event.key === yourKey przed reakcją. Ignorowanie niezwiązanych kluczy zapobiega niepotrzebnym ponownym renderowaniom.
Należy również obsłużyć sytuację, w której event.newValue ma wartość null, co oznacza usunięcie klucza.
Aktualizowanie stanu Reacta po zdarzeniu
Gdy nadejdzie istotna zmiana, należy sparsować event.newValue i wywołać setter, aby zaktualizować stan Reacta. Dzięki temu druga karta zostaje zsynchronizowana ze zmianą wprowadzoną w innym miejscu.
W połączeniu z hookiem useLocalStorage zamyka to cykl synchronizacji między kartami.
Alternatywa w postaci BroadcastChannel
BroadcastChannel umożliwia kartom tego samego origin bezpośrednie wysyłanie do siebie wiadomości za pomocą postMessage. Jest to rozwiązanie bardziej przejrzyste niż wykorzystywanie zdarzeń storage i działa nawet bez zapisywania danych w localStorage.
Należy utworzyć kanał o określonej nazwie, wysyłać aktualizacje i nasłuchiwać zdarzeń message.
useSyncExternalStore dla magazynu danych
React udostępnia useSyncExternalStore do subskrybowania zewnętrznych magazynów w sposób bezpieczny dla renderowania współbieżnego. Funkcję subskrypcji można połączyć ze zdarzeniem storage, a migawkę — z odczytem localStorage.
Pozwala to poprawnie zintegrować aktualizacje zewnętrznego magazynu z renderowaniem Reacta.
Przypadek użycia: wylogowanie na wszystkich kartach
Klasycznym przypadkiem użycia jest wylogowanie ze wszystkich kart: gdy jedna karta usuwa flagę uwierzytelniania, zdarzenie storage w pozostałych kartach wykrywa tę zmianę i przekierowuje je do ekranu logowania.
Zapobiega to sytuacji, w której nieaktualna karta nadal wyświetla uwierzytelnioną zawartość.
Synchronizacja trybu ciemnego między kartami
Motyw również świetnie się do tego nadaje: włączenie trybu ciemnego w jednej karcie zapisuje zmianę w localStorage, zdarzenie storage jest wywoływane w pozostałych kartach, a one natychmiast aktualizują swój stan motywu.
Użytkownik widzi spójny wygląd niezależnie od tego, na którą kartę przełączy.
Złożenie wszystkiego w całość
Synchronizacja między kartami sprowadza się do nasłuchiwania zdarzenia storage (lub użycia BroadcastChannel), filtrowania własnych kluczy i aktualizowania stanu Reacta na podstawie nowej wartości.
W przypadku solidnych subskrypcji bezpiecznych dla renderowania współbieżnego nowoczesnym wyborem jest useSyncExternalStore.
Sprawdzenie wiedzy
Sprawdź swoją wiedzę na temat zdarzeń między kartami.
Podsumowanie
Dowiedziałeś się, że zdarzenie storage jest wywoływane w innych kartach, a także jak nasłuchiwać tego zdarzenia, filtrować je według klucza i aktualizować stan. Poznałeś również alternatywy w postaci BroadcastChannel i useSyncExternalStore.
Poznałeś rzeczywiste przypadki użycia, takie jak wylogowanie ze wszystkich kart i synchronizacja trybu ciemnego między kartami.
Ucz się React dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 88
- Lekcje
- 324
Często zadawane pytania
Czy lekcja „Obsługa zdarzeń pamięci między kartami” jest bezpłatna?
Tak — pełny tekst „Obsługa zdarzeń pamięci między kartami” 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 „Obsługa zdarzeń pamięci między kartami”?
Proszę reagować na zmiany w localStorage w innych kartach przeglądarki za pomocą nasłuchiwania zdarzenia storage. Ć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 3 z 4.
Ile czasu zajmuje lekcja „Obsługa zdarzeń pamięci między kartami”?
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