Фаза отображения и фиксация DOM
Проследите цикл отображения React: от вычисления JSX через согласование до этапа отрисовки браузером
«Фаза отображения и фиксация DOM» — бесплатный урок React Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Обзор рабочего цикла React
Рабочий цикл React состоит из двух основных фаз: фазы отрисовки и фазы применения изменений. Во время фазы отрисовки React вызывает функции компонентов и строит виртуальное представление пользовательского интерфейса — волоконное дерево. Во время фазы применения изменений React переносит изменения из волоконного дерева в настоящий DOM.
Фазу отрисовки можно прервать
В конкурентном режиме React 18 фазу отрисовки можно приостановить, прервать или начать заново. React может вызвать функцию компонента несколько раз, прежде чем применить какие-либо изменения. Поэтому функции компонентов должны быть чистыми: у них не должно быть побочных эффектов, поскольку функция может выполняться более одного раза для одного видимого обновления.
Фаза применения изменений всегда выполняется синхронно
В отличие от фазы отрисовки фаза применения изменений всегда выполняется синхронно и доводится до конца. React нельзя прервать во время применения изменений к DOM. Благодаря этому DOM никогда не остаётся в частично обновлённом состоянии. После каждого применения изменений пользователи видят полностью согласованный интерфейс.
Три подпроцесса фазы применения изменений
Фаза применения изменений состоит из трёх подпроцессов: до изменения (здесь выполняется getSnapshotBeforeUpdate компонента-класса, чтобы прочитать значения DOM до изменений), изменение (React вставляет, обновляет и удаляет узлы DOM) и раскладка (здесь синхронно выполняются эффекты, в частности useLayoutEffect и componentDidMount/componentDidUpdate компонента-класса).
Пассивные эффекты: useEffect
useEffect является пассивным эффектом, то есть не выполняется во время фазы применения изменений. После завершения этой фазы и отрисовки страницы браузером React асинхронно планирует пассивные эффекты. Они выполняются после того, как браузер получает возможность вывести обновлённый DOM на экран.
Момент отрисовки браузером
Браузер выполняет отрисовку между фазой раскладки, где запускается useLayoutEffect, и фазой пассивных эффектов, где запускается useEffect. Это важное различие во времени: useLayoutEffect выполняется до отрисовки, а useEffect — после неё. Для эффектов, изменяющих визуальный результат, это различие имеет большое значение.
Почему useEffect может вызвать двойное визуальное обновление
Если useEffect считывает DOM и обновляет состояние, например измеряет элемент и задаёт состояние его размера, React снова выполнит отрисовку и применит изменения. Браузер выполнит отрисовку дважды: сначала с исходным размером, затем с исправленным. Пользователь может увидеть кратковременную вспышку элемента неправильного размера, прежде чем появится исправление.
Дерево волокон
React внутренне строит дерево узлов «волокон» — по одному на каждый экземпляр компонента. В каждом волокне хранятся состояние, эффекты и результат работы компонента. На этапе рендеринга React создаёт новое рабочее дерево волокон. На этапе фиксации это рабочее дерево становится текущим, а старое повторно используется.
Двойной вызов в строгом режиме
React в строгом режиме намеренно дважды вызывает функции компонентов и эффекты в режиме разработки, чтобы помочь обнаружить побочные эффекты. И useLayoutEffect, и useEffect монтируются, размонтируются и монтируются снова. В рабочей среде этот двойной вызов не происходит. Это помогает выявить ошибки, возникающие из-за неправильной очистки эффектов.
Почему функции компонентов должны быть чистыми
Поскольку этап рендеринга может быть прерван и запущен повторно, функции компонентов должны выдавать одинаковый результат для одинаковых входных данных и не иметь побочных эффектов. Изменения, подписки и вызовы API в теле функции, а не в эффектах, будут выполняться чаще, чем ожидается, в конкурентном режиме, что приведёт к ошибкам.
Чтение DOM во время рендеринга и в эффектах
Никогда не читайте свойства DOM непосредственно в теле функции компонента. DOM может ещё не существовать при серверном рендеринге или может быть устаревшим при повторном рендеринге. Всегда читайте DOM внутри useLayoutEffect для чтения до отрисовки или useEffect для чтения после отрисовки, где DOM гарантированно актуален.
Подэтапы этапа фиксации React
На каком подэтапе этапа фиксации React срабатывает useLayoutEffect?
Повторение урока: этап рендеринга и фиксация DOM
На этапе рендеринга React строит дерево волокон, и этот этап может быть прерван; этап фиксации применяет изменения к DOM и всегда выполняется синхронно. Фиксация состоит из трёх подэтапов: до изменения, изменение и компоновка. useLayoutEffect срабатывает на этапе компоновки до отрисовки. useEffect срабатывает как пассивный эффект после отрисовки.
Часто задаваемые вопросы
Урок «Фаза отображения и фиксация DOM» бесплатный?
Да — полный текст урока «Фаза отображения и фиксация DOM» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Фаза отображения и фиксация DOM»?
Проследите цикл отображения React: от вычисления JSX через согласование до этапа отрисовки браузером Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Фаза отображения и фиксация DOM»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Фаза отображения и фиксация DOM
- Когда срабатывает useLayoutEffect по сравнению с useEffect
- Измерение элементов DOM с помощью useLayoutEffect
- Как избежать перерасчёта компоновки и визуального мерцания