0Pricing
React Academy · Lekcja

Kiedy uruchamia się useLayoutEffect, a kiedy useEffect

Poznać fakt, że useLayoutEffect uruchamia się synchronicznie po mutacjach DOM, ale przed narysowaniem strony przez przeglądarkę

Kiedy uruchamia się useLayoutEffect, a kiedy useEffect 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.

Czas uruchamiania useLayoutEffect

useLayoutEffect jest uruchamiany synchronicznie natychmiast po zastosowaniu przez Reacta mutacji DOM, ale zanim przeglądarka zdąży namalować te zmiany. Z perspektywy przeglądarki efekt layoutu i mutacje DOM są częścią tego samego, nieprzerwanego, synchronicznego bloku pracy.

Czas uruchamiania useEffect

useEffect jest uruchamiany asynchronicznie po zakończeniu malowania przez przeglądarkę. Użytkownik najpierw widzi zaktualizowany interfejs, a dopiero potem uruchamiany jest efekt. Dzięki temu useEffect w mniejszym stopniu zakłóca wydajność renderowania, ale wszelkie widoczne zmiany spowodowane przez efekt skutkują kolejnym cyklem malowania.

Eksperyment ze znacznikami czasu

Różnicę w czasie można zweryfikować, zapisując znaczniki czasu w obu efektach: dodaj console.log('layout', Date.now()) w useLayoutEffect oraz console.log('passive', Date.now()) w useEffect. W konsoli znacznik czasu efektu layoutu będzie zawsze wcześniejszy niż znacznik czasu efektu pasywnego, co potwierdzi kolejność wykonywania.

Widoczne konsekwencje dla użytkowników

Jeśli useEffect aktualizuje stan wpływający na wygląd interfejsu, użytkownik widzi dwa renderowania: początkowe renderowanie z nieaktualnym stanem, a następnie poprawione renderowanie po uruchomieniu efektu. Objawia się to widocznym mignięciem lub ponownym ułożeniem elementów. useLayoutEffect zapobiega temu, ponieważ jego aktualizacje stanu są zatwierdzane, zanim przeglądarka cokolwiek namaluje.

Aktualizacja stanu w useLayoutEffect powoduje synchroniczne ponowne renderowanie

Jeśli wywołasz setState wewnątrz useLayoutEffect, React natychmiast uruchomi kolejny cykl renderowania i commitowania przed malowaniem. Przeglądarka namaluje tylko końcowy wynik — użytkownik nigdy nie zobaczy stanu pośredniego. To główny przypadek użycia useLayoutEffect: zmierzyć DOM, obliczyć nową wartość, ustawić stan i zagwarantować jedno poprawne malowanie.

Ograniczenia wydajnościowe

Ponieważ useLayoutEffect działa synchronicznie przed malowaniem i może wywoływać dodatkowe renderowania, jego nadmierne używanie może pogorszyć wydajność. Jeśli praca synchroniczna jest intensywna, blokuje przeglądarkę przed malowaniem, powodując widoczne zacinanie. Używaj go tylko wtedy, gdy trzeba zapobiec widocznemu mignięciu; we wszystkich pozostałych przypadkach używaj useEffect.

Podwójne wywołanie w Strict Mode

W React Strict Mode (tylko w środowisku deweloperskim) zarówno useLayoutEffect, jak i useEffect są wywoływane dwukrotnie przy każdym montowaniu. Sekwencja wygląda tak: montowanie, czyszczenie, ponowne montowanie. Pomaga to wykrywać efekty, które nie są prawidłowo czyszczone. Podwójne wywołanie nie występuje w kompilacjach produkcyjnych.

Zasada wydajności: domyślnie używaj useEffect

Domyślnym wyborem powinien być zawsze useEffect. Przełącz się na useLayoutEffect tylko wtedy, gdy możesz zaobserwować i odtworzyć problem z widocznym migotaniem lub nieprawidłowym układem. Nadużywanie useLayoutEffect niepotrzebnie blokuje potok malowania przeglądarki i może pogorszyć postrzeganą wydajność.

Ograniczenie SSR: useLayoutEffect na serwerze

useLayoutEffect nie może działać na serwerze, ponieważ w środowisku serwerowym nie ma DOM ani cyklu malowania przeglądarki. Jeśli użyjesz go w komponencie renderowanym na serwerze, React wyświetli ostrzeżenie. Rozwiązaniem jest warunkowe pominięcie efektu: sprawdź typeof window !== 'undefined' albo przełącz się na useEffect w kodzie zgodnym z SSR.

Jak ustalić, którego efektu użyć

Zadaj sobie pytanie: „Czy ten efekt zmienia coś, co użytkownik zobaczy już podczas pierwszego malowania?” Jeśli tak, użyj useLayoutEffect, aby zapobiec mignięciu. Jeśli nie — na przykład w przypadku pobierania danych, subskrypcji, analityki, rejestrowania i większości innych efektów ubocznych — użyj useEffect. Te zasady pozwalają rozstrzygnąć większość przypadków spotykanych w praktyce.

Synchroniczny charakter useLayoutEffect

useLayoutEffect działa w tym samym synchronicznym bloku co mutacje DOM. React nie może przetwarzać innej pracy, takiej jak reagowanie na zdarzenia użytkownika, gdy działa useLayoutEffect. Dlatego efekt ten musi być szybki i skoncentrowany na jednym zadaniu. Długi kod synchroniczny w useLayoutEffect bezpośrednio opóźnia wyświetlenie obrazu przez przeglądarkę.

Czas uruchamiania useLayoutEffect

Dokładnie kiedy useLayoutEffect jest uruchamiany w odniesieniu do mutacji DOM i malowania przez przeglądarkę?

Podsumowanie lekcji: useLayoutEffect a useEffect

useLayoutEffect działa synchronicznie i jest uruchamiany przed malowaniem przez przeglądarkę, dzięki czemu nadaje się do mierzenia DOM i korygowania wyglądu. useEffect jest uruchamiany po malowaniu i jest właściwym wyborem do pobierania danych, subskrypcji i większości efektów ubocznych. Domyślnie używaj useEffect, a przełączaj się na useLayoutEffect tylko wtedy, gdy migotanie wskazuje, że jest on potrzebny. Unikaj używania go w SSR bez odpowiednich zabezpieczeń.

Często zadawane pytania

Czy lekcja „Kiedy uruchamia się useLayoutEffect, a kiedy useEffect” jest bezpłatna?

Tak — pełny tekst „Kiedy uruchamia się useLayoutEffect, a kiedy useEffect” 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 „Kiedy uruchamia się useLayoutEffect, a kiedy useEffect”?

Poznać fakt, że useLayoutEffect uruchamia się synchronicznie po mutacjach DOM, ale przed narysowaniem strony przez przeglądarkę Ć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 „Kiedy uruchamia się useLayoutEffect, a kiedy useEffect”?

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

  1. Faza renderowania i zatwierdzanie DOM
  2. Kiedy uruchamia się useLayoutEffect, a kiedy useEffect
  3. Pomiar elementów DOM za pomocą useLayoutEffect
  4. Unikanie przeciążenia layoutu i migotania wizualnego
← Powrót do React Academy