useLayoutEffect do pomiarów przed animacją
Proszę użyć useLayoutEffect do zmierzenia wymiarów elementu przed rozpoczęciem animacji, aby uniknąć przeskoków układu.
useLayoutEffect do pomiarów przed animacją 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 migotania
Czasami element podczas pierwszego renderowania wyraźnie przeskakuje lub miga, zanim znajdzie się na właściwym miejscu. Zwykle dzieje się tak, gdy pomiar lub zmiana położenia elementu następuje dopiero po tym, jak przeglądarka już go wyrenderowała.
Użytkownik przez jedną klatkę widzi nieprawidłowe położenie, a następnie nagłą korektę, co wygląda jak błąd.
Dlaczego useEffect powoduje migotanie
useEffect uruchamia się po wyrenderowaniu przez przeglądarkę. Jeśli więc w useEffect odczytany zostanie pomiar i zaktualizowany DOM, użytkownik zdąży już zobaczyć niepoprawioną klatkę, zanim zmiana zostanie zastosowana.
W przypadku pozycjonowania elementów, które musi być niewidoczne dla użytkownika, wykonanie operacji po renderowaniu następuje zbyt późno.
useLayoutEffect uruchamia się przed renderowaniem
useLayoutEffect uruchamia się synchronicznie po zmodyfikowaniu DOM-u przez React, ale przed renderowaniem przez przeglądarkę. Każdy odczyt lub zapis DOM-u wykonany w tym miejscu zostanie zastosowany, zanim użytkownik zobaczy choćby jedną klatkę.
Dlatego jest to właściwe narzędzie do pomiarów i pozycjonowania, które od początku musi wyglądać poprawnie.
Pomiar początkowego położenia
Wewnątrz useLayoutEffect można odczytać układ elementu za pomocą ref.current.getBoundingClientRect(), aby zapisać jego położenie i rozmiar przed rozpoczęciem animacji.
Ponieważ kod ten wykonuje się przed renderowaniem, można jednocześnie wykonać pomiar i zastosować początkową transformację bez widocznego migotania.
Technika FLIP
FLIP to skrót od First, Last, Invert, Play. Najpierw zapisuje się początkowe położenie elementu (First), następnie pozwala mu przejść do końcowego położenia (Last), po czym odwraca się tę zmianę (Invert), stosując transformację, która wizualnie przywraca element do położenia początkowego, a na końcu odtwarza się animację (Play), usuwając transformację, aby element przeszedł do położenia końcowego.
Pozwala to animować zmiany układu za pomocą wyłącznie wydajnej właściwości transform, mimo że rzeczywisty układ zmienił się natychmiast.
getBoundingClientRect w useLayoutEffect
Kluczowe odczyty wykonuje się w useLayoutEffect: przed zmianą zapisuje się prostokąt początkowy, po zmianie prostokąt końcowy, a następnie oblicza różnicę. Wykonanie tego przed renderowaniem gwarantuje, że transformacja odwracająca zostanie zastosowana, zanim cokolwiek zostanie wyświetlone.
Różnica między tymi dwoma prostokątami określa dokładne wartości przesunięcia i skali potrzebne do odwrócenia zmiany.
Synchroniczne zastosowanie transformacji
Transformację odwracającą ustawia się synchronicznie wewnątrz useLayoutEffect, a następnie w kolejnej klatce usuwa, aby element animował się do swojego naturalnego położenia. Często krok odtwarzania animacji wywołuje się za pomocą requestAnimationFrame.
Ponieważ transformacja odwracająca została zastosowana przed renderowaniem, użytkownik nigdy nie widzi elementu w jego niezmienionym położeniu końcowym.
Ostrzeżenie dotyczące SSR
Na serwerze nie ma DOM-u, dlatego React rejestruje ostrzeżenie informujące, że useLayoutEffect nie wykonuje żadnych działań podczas renderowania po stronie serwera. Efekty układu mają sens wyłącznie w przeglądarce.
To ostrzeżenie sygnalizuje, że efekt nie może się wykonać tam, gdzie nie ma niczego, co można zmierzyć.
Alternatywa bezpieczna dla SSR
Jeśli komponent musi działać na serwerze, należy użyć useEffect w połączeniu z requestAnimationFrame, aby wykonać pomiar przed następnym renderowaniem, albo warunkowo używać useLayoutEffect wyłącznie w przeglądarce.
Pozwala to uniknąć ostrzeżenia, a jednocześnie uzyskać czas wykonania zbliżony do momentu przed renderowaniem w przypadku animacji niekrytycznych.
Przykład rozwijanego akordeonu
Animowanie wysokości to klasyczny przypadek: w useLayoutEffect należy zmierzyć wysokość zwiniętego i rozwiniętego elementu, a następnie animować przejście między konkretnymi wartościami w pikselach, aby uzyskać płynny efekt.
Ponieważ wysokości auto nie można animować, wcześniejszy pomiar rzeczywistej wysokości pozwala wykonać przejście do konkretnej wartości.
Kiedy używać useLayoutEffect
W większości przypadków należy domyślnie używać useEffect. Po useLayoutEffect należy sięgać tylko wtedy, gdy odczytuje się układ i trzeba zmodyfikować DOM przed renderowaniem, aby uniknąć widocznego migotania.
Nadużywanie tego rozwiązania może pogorszyć wydajność, ponieważ blokuje renderowanie do czasu zakończenia efektu.
Szybki test
Sprawdź swoją wiedzę na temat momentu wykonywania efektów.
Podsumowanie
Dowiedział się Pan, że problem migotania wynika z wykonywania pomiaru po renderowaniu, że useLayoutEffect uruchamia się przed renderowaniem oraz jak technika FLIP animuje zmiany układu za pomocą wydajnych transformacji.
Poznał Pan również ostrzeżenie dotyczące SSR oraz rozwiązanie zastępcze oparte na useEffect i requestAnimationFrame.
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 „useLayoutEffect do pomiarów przed animacją” jest bezpłatna?
Tak — pełny tekst „useLayoutEffect do pomiarów przed animacją” 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 „useLayoutEffect do pomiarów przed animacją”?
Proszę użyć useLayoutEffect do zmierzenia wymiarów elementu przed rozpoczęciem animacji, aby uniknąć przeskoków układu. Ć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 „useLayoutEffect do pomiarów przed animacją”?
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
- Przejścia CSS przy zmianach stanu React
- Animacje CSS z użyciem keyframes w React
- useLayoutEffect do pomiarów przed animacją
- Animacje wejścia i wyjścia bez biblioteki