API useSyncExternalStore i parametry
Proszę poznać argumenty subscribe, getSnapshot i getServerSnapshot oraz gwarancje, które muszą one zapewniać.
API useSyncExternalStore i parametry 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.
Przegląd trzech argumentów
useSyncExternalStore przyjmuje maksymalnie trzy argumenty: subscribe, getSnapshot oraz opcjonalny getServerSnapshot. Razem informują one Reacta, jak nasłuchiwać zmian i jak odczytywać bieżącą wartość.
Zrozumienie każdego argumentu jest kluczowe, ponieważ drobne błędy w tych funkcjach są najczęstszym źródłem problemów podczas korzystania z tego hooka.
Funkcja subscribe
subscribe otrzymuje callback od Reacta i musi zarejestrować go w store'ze, aby callback był uruchamiany za każdym razem, gdy store się zmieni. Funkcja musi zwrócić funkcję anulującą subskrypcję, którą React wywołuje podczas sprzątania.
React wykorzystuje ją do ustalenia, kiedy należy ponownie odczytać snapshot, dlatego subscribe służy wyłącznie do konfigurowania i usuwania powiadomień o zmianach.
getSnapshot zwraca bieżącą wartość
getSnapshot zwraca bieżącą wartość store'a. React wywołuje tę funkcję podczas renderowania, aby odczytać stan, a następnie ponownie po otrzymaniu powiadomień, aby wykryć, czy wartość się zmieniła.
Co najważniejsze, gdy bazowe dane się nie zmieniły, funkcja musi zwracać wynik stabilny referencyjnie — tę samą referencję zamiast za każdym razem tworzyć nowy obiekt.
getServerSnapshot na potrzeby SSR
Opcjonalny getServerSnapshot dostarcza wartość używaną podczas renderowania po stronie serwera oraz w początkowej fazie hydratacji. Jest potrzebny, ponieważ przeznaczony wyłącznie dla przeglądarki getSnapshot może korzystać z API, które nie istnieją na serwerze.
Jego podanie zapobiega niezgodnościom podczas hydratacji, ponieważ serwer otrzymuje sensowną wartość do wyrenderowania, zgodną z początkowym wynikiem po stronie klienta.
Wartość zwracana
Hook zwraca bieżącą wartość snapshotu, której używają Państwo bezpośrednio w komponencie tak jak każdej innej części stanu. Gdy store się zmieni, React ponownie renderuje komponent, a hook zwraca zaktualizowany snapshot.
Z perspektywy komponentu wygląda to jak odczytywanie reaktywnego stanu, mimo że źródło prawdy znajduje się w całości poza Reactem.
getSnapshot musi działać synchronicznie i spójnie
getSnapshot musi działać synchronicznie i zwracać wartość wyprowadzoną wyłącznie z bieżącego stanu store'a. Nie powinien wykonywać pracy asynchronicznej ani zwracać różnych wyników dla tych samych danych bazowych.
React polega na wielokrotnym wywoływaniu tej funkcji i porównywaniu wyników, dlatego niedeterminizm lub efekty uboczne w jej wnętrzu mogą prowadzić do nieprawidłowego działania.
Wzorzec niezmiennego snapshotu
W store'ach przechowujących niezmienny stan implementacja getSnapshot jest prosta, ponieważ referencja bieżącego obiektu stanu zmienia się tylko wtedy, gdy zmienią się dane. Zwracanie tej referencji zapewnia stabilne porównania bez dodatkowego wysiłku.
Właśnie dlatego wzorce niezmiennych aktualizacji tak dobrze współpracują z tym hookiem: te same dane oznaczają tę samą referencję, a React pomija niepotrzebne ponowne renderowanie.
Błąd powodujący nieskończoną pętlę
Częstym błędem jest zwracanie zupełnie nowego obiektu lub tablicy przy każdym wywołaniu getSnapshot, na przykład przez wykonanie w nim mapowania lub filtrowania. React za każdym razem widzi nową referencję i uznaje, że wartość się zmieniła.
Prowadzi to do nieskończonego ponownego renderowania lub ostrzeżeń. Rozwiązaniem jest buforowanie wyprowadzonej wartości i zwracanie tej samej referencji do momentu rzeczywistej zmiany danych źródłowych.
Zachowywanie stabilności snapshotów
Aby uniknąć tej pętli, należy obliczać dane wyprowadzone poza getSnapshot albo je zapamiętywać, tak aby funkcja zwracała zbuforowaną referencję. Wzorzec oparty na selektorze, używany przez wiele bibliotek, służy właśnie do zarządzania tą stabilnością.
Najważniejsza zasada mówi, że dwa wywołania getSnapshot przy niezmienionych danych store'a muszą zwrócić dokładnie tę samą referencję.
Połączenie parametrów
W praktyce należy napisać subscribe, które dodaje i usuwa listener, getSnapshot odczytujące stabilną bieżącą wartość oraz — na potrzeby SSR — getServerSnapshot zwracające wartość bezpieczną dla serwera.
Gdy wszystkie trzy elementy są poprawne, hook zapewnia spójne i bezpieczne współbieżnie odczyty z zewnętrznego store'a bez zbędnej otoczki.
Szybkie sprawdzenie: parametry useSyncExternalStore
Proszę określić rolę getSnapshot.
Podsumowanie: API useSyncExternalStore
Hook przyjmuje subscribe, getSnapshot oraz opcjonalnie getServerSnapshot. subscribe podłącza listener i zwraca funkcję anulującą subskrypcję; getSnapshot synchronicznie odczytuje bieżącą wartość i musi być stabilne referencyjnie; getServerSnapshot dostarcza wartość bezpieczną dla SSR.
Klasyczną pułapką jest zwracanie nowego obiektu przy każdym wywołaniu, co powoduje nieskończone pętle. Należy buforować wyprowadzone wartości, aby niezmienione dane zwracały tę samą referencję.
Często zadawane pytania
Czy lekcja „API useSyncExternalStore i parametry” jest bezpłatna?
Tak — pełny tekst „API useSyncExternalStore i parametry” 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 „API useSyncExternalStore i parametry”?
Proszę poznać argumenty subscribe, getSnapshot i getServerSnapshot oraz gwarancje, które muszą one zapewniać. Ć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 „API useSyncExternalStore i parametry”?
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
- Problem z subskrypcjami zewnętrznego store’a
- API useSyncExternalStore i parametry
- Subskrybowanie API przeglądarki
- Budowanie niestandardowego store’a za pomocą useSyncExternalStore