Faza renderowania i zatwierdzanie DOM
Śledzić cykl renderowania Reacta od ewaluacji JSX przez uzgadnianie aż po etap rysowania w przeglądarce
Faza renderowania i zatwierdzanie DOM to bezpłatna lekcja React Academy na CoddyKit. To lekcja 1 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 cyklu pracy Reacta
Cykl pracy Reacta składa się z dwóch głównych faz: fazy renderowania i fazy commit. Podczas fazy renderowania React wywołuje funkcje komponentów i buduje wirtualną reprezentację interfejsu użytkownika (drzewo fiber). Podczas fazy commit React stosuje zmiany z drzewa fiber do rzeczywistego DOM.
Faza renderowania może zostać przerwana
W trybie Concurrent Mode w React 18 faza renderowania może zostać wstrzymana, przerwana lub rozpoczęta ponownie. React może wielokrotnie wywołać funkcję komponentu, zanim zatwierdzi jakiekolwiek zmiany. Dlatego funkcje komponentów muszą być czyste — nie mogą zawierać efektów ubocznych, ponieważ funkcja może zostać uruchomiona więcej niż raz dla jednej widocznej aktualizacji.
Faza commit jest zawsze synchroniczna
W przeciwieństwie do fazy renderowania faza commit jest zawsze synchroniczna i wykonuje się do końca. React nie może zostać przerwany podczas zatwierdzania zmian w DOM. Dzięki temu DOM nigdy nie pozostaje w częściowo zaktualizowanym stanie. Po każdym zatwierdzeniu użytkownicy widzą w pełni spójny interfejs.
Trzy podfazy fazy commit
Faza commit ma trzy podfazy: before mutation (w tej podfazie metoda getSnapshotBeforeUpdate komponentu klasowego odczytuje wartości DOM przed wprowadzeniem zmian), mutation (React wstawia, aktualizuje i usuwa węzły DOM) oraz layout (w tej podfazie uruchamiane są efekty synchroniczne, w szczególności useLayoutEffect oraz componentDidMount/componentDidUpdate komponentu klasowego).
Efekty pasywne: useEffect
useEffect jest efektem pasywnym, co oznacza, że nie jest wykonywany podczas fazy commit. Po zakończeniu fazy commit i wyrenderowaniu obrazu przez przeglądarkę React asynchronicznie planuje wykonanie efektów pasywnych. Są one uruchamiane dopiero wtedy, gdy przeglądarka miała możliwość wyświetlenia zaktualizowanego DOM na ekranie.
Moment renderowania przez przeglądarkę
Przeglądarka renderuje obraz między fazą layoutu, w której uruchamiany jest useLayoutEffect, a fazą efektów pasywnych, w której uruchamiany jest useEffect. To kluczowa różnica w czasie wykonania: useLayoutEffect uruchamia się przed renderowaniem obrazu, a useEffect — po nim. To rozróżnienie ma duże znaczenie w przypadku efektów zmieniających wygląd interfejsu.
Dlaczego useEffect może powodować podwójną aktualizację obrazu
Jeśli useEffect odczytuje DOM i aktualizuje stan (na przykład mierzy element i ustawia stan rozmiaru), React ponownie renderuje interfejs i ponownie wykonuje fazę commit. Przeglądarka renderuje obraz dwukrotnie: najpierw z początkowym rozmiarem, a następnie z rozmiarem skorygowanym. Użytkownicy mogą zobaczyć krótkie mignięcie nieprawidłowego rozmiaru, zanim pojawi się poprawka.
Drzewo Fiber
React wewnętrznie buduje drzewo węzłów „fiber”, po jednym dla każdej instancji komponentu. Każdy węzeł fiber przechowuje stan komponentu, efekty i dane wyjściowe. W fazie renderowania React tworzy nowe robocze drzewo fiber. W fazie commitowania robocze drzewo staje się bieżącym drzewem, a stare drzewo jest ponownie wykorzystywane.
Podwójne wywołanie w Strict Mode
React Strict Mode celowo wywołuje funkcje komponentów i efekty dwukrotnie w środowisku deweloperskim, aby ułatwić wykrywanie efektów ubocznych. Zarówno useLayoutEffect, jak i useEffect są montowane, odmontowywane i montowane ponownie. To podwójne wywołanie nie występuje w środowisku produkcyjnym. Ma ono ujawnić błędy wynikające z nieprawidłowego czyszczenia efektów.
Dlaczego funkcje komponentów muszą być czyste
Ponieważ faza renderowania może zostać przerwana i uruchomiona ponownie, funkcje komponentów muszą dla tych samych danych wejściowych zwracać ten sam wynik i nie powodować efektów ubocznych. Mutacje, subskrypcje i wywołania API umieszczone w treści funkcji, a nie w efektach, będą w trybie Concurrent Mode wykonywane częściej, niż można się spodziewać, co prowadzi do błędów.
Odczytywanie DOM podczas renderowania a w efektach
Nigdy nie odczytuj bezpośrednio właściwości DOM w treści funkcji komponentu. DOM może jeszcze nie istnieć podczas renderowania po stronie serwera albo może być nieaktualny podczas ponownego renderowania. Zawsze odczytuj DOM wewnątrz useLayoutEffect (aby odczytać go przed malowaniem) lub useEffect (aby odczytać go po malowaniu), gdy masz gwarancję, że DOM jest aktualny.
Podfazy fazy commitowania React
W której podfazie fazy commitowania React jest uruchamiany useLayoutEffect?
Podsumowanie lekcji: faza renderowania i commitowanie DOM
Faza renderowania React buduje drzewo fiber i może zostać przerwana, natomiast faza commitowania stosuje zmiany w DOM i zawsze przebiega synchronicznie. Commitowanie składa się z trzech podfaz: przed mutacją, mutacji i layoutu. useLayoutEffect jest uruchamiany w fazie layoutu przed malowaniem. useEffect jest uruchamiany jako efekt pasywny po malowaniu.
Często zadawane pytania
Czy lekcja „Faza renderowania i zatwierdzanie DOM” jest bezpłatna?
Tak — pełny tekst „Faza renderowania i zatwierdzanie DOM” 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 „Faza renderowania i zatwierdzanie DOM”?
Śledzić cykl renderowania Reacta od ewaluacji JSX przez uzgadnianie aż po etap rysowania w przeglądarce Ć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 1 z 4.
Ile czasu zajmuje lekcja „Faza renderowania i zatwierdzanie DOM”?
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
- Faza renderowania i zatwierdzanie DOM
- Kiedy uruchamia się useLayoutEffect, a kiedy useEffect
- Pomiar elementów DOM za pomocą useLayoutEffect
- Unikanie przeciążenia layoutu i migotania wizualnego