Когда срабатывает useLayoutEffect по сравнению с useEffect
Узнайте, что useLayoutEffect синхронно срабатывает после изменений DOM, но до отрисовки браузером
«Когда срабатывает useLayoutEffect по сравнению с useEffect» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Момент срабатывания useLayoutEffect
useLayoutEffect срабатывает синхронно сразу после того, как React применил изменения DOM, но до того, как браузер успел отрисовать эти изменения. С точки зрения браузера, эффект компоновки и изменения DOM входят в один непрерывный синхронный блок работы.
Момент срабатывания useEffect
useEffect срабатывает асинхронно после завершения отрисовки браузером. Пользователь сначала видит обновлённый интерфейс, а затем выполняется эффект. Благодаря этому useEffect меньше мешает производительности рендеринга, но любые видимые изменения, вызванные эффектом, приводят ко второму циклу отрисовки.
Эксперимент с временными метками
Вы можете проверить разницу во времени, записав временные метки в обоих эффектах: добавьте console.log('layout', Date.now()) в useLayoutEffect и console.log('passive', Date.now()) в useEffect. В консоли временная метка эффекта компоновки всегда будет раньше временной метки пассивного эффекта, подтверждая порядок выполнения.
Видимые последствия для пользователей
Если useEffect обновляет состояние, влияющее на визуальный результат, пользователь видит две отрисовки: исходную с устаревшим состоянием, а затем исправленную после срабатывания эффекта. Это проявляется как заметная вспышка или перерасчёт компоновки. useLayoutEffect предотвращает это, поскольку его обновления состояния фиксируются до того, как браузер что-либо отрисует.
Обновление состояния в useLayoutEffect вызывает синхронный повторный рендеринг
Если вызвать setState внутри useLayoutEffect, React немедленно запускает ещё один цикл рендеринга и фиксации до отрисовки. Браузер отрисовывает только итоговый результат — пользователь никогда не видит промежуточное состояние. Это основной случай использования useLayoutEffect: измерить DOM, вычислить новое значение, установить состояние и гарантировать одну чистую отрисовку.
Оговорка о производительности
Поскольку useLayoutEffect выполняется синхронно до отрисовки и может запускать дополнительные рендеринги, чрезмерное использование способно ухудшить производительность. Если синхронная работа слишком тяжёлая, она блокирует отрисовку браузера и вызывает заметные рывки. Используйте этот эффект только для предотвращения визуальной вспышки, а во всех остальных случаях применяйте useEffect.
Двойной вызов в строгом режиме
В строгом режиме React, только в режиме разработки, и useLayoutEffect, и useEffect вызываются дважды при каждом монтировании. Последовательность такова: монтирование, очистка, повторное монтирование. Это помогает обнаружить эффекты, которые не очищаются должным образом. В сборках для рабочей среды двойной вызов не происходит.
Правило производительности: по умолчанию выбирайте useEffect
По умолчанию всегда следует выбирать useEffect. Переключайтесь на useLayoutEffect только тогда, когда можете наблюдать и воспроизвести визуальное мерцание или проблему с неправильной компоновкой. Чрезмерное использование useLayoutEffect без необходимости блокирует конвейер отрисовки браузера и может ухудшить воспринимаемую производительность.
Оговорка для SSR: useLayoutEffect на сервере
useLayoutEffect не может выполняться на сервере, поскольку в серверной среде нет DOM и цикла отрисовки браузера. Если использовать его в компоненте, который отображается на сервере, React выдаст предупреждение. Исправление состоит в том, чтобы условно пропустить эффект: проверьте typeof window !== 'undefined' или замените его на useEffect для кода, совместимого с SSR.
Как определить, какой вариант выбрать
Спросите себя: «Изменяет ли этот эффект что-либо, что пользователь увидит уже при самой первой отрисовке?» Если да, используйте useLayoutEffect, чтобы предотвратить вспышку. Если нет — для получения данных, подписок, аналитики, журналирования и большинства других побочных эффектов — используйте useEffect. Этот принцип выбора охватывает большинство практических случаев.
Синхронная природа useLayoutEffect
useLayoutEffect выполняется в том же синхронном блоке, что и изменения DOM. Пока работает useLayoutEffect, React не может обрабатывать другую работу, например реагировать на действия пользователя. Поэтому эффект должен быть быстрым и целенаправленным. Длительный синхронный код в useLayoutEffect напрямую задерживает отображение содержимого браузером на экране.
Момент срабатывания useLayoutEffect
В какой именно момент useLayoutEffect срабатывает относительно изменений DOM и отрисовки браузером?
Повторение урока: useLayoutEffect и useEffect
useLayoutEffect выполняется синхронно до отрисовки браузером, поэтому подходит для измерения DOM и визуальных исправлений. useEffect срабатывает после отрисовки и является правильным выбором для получения данных, подписок и большинства побочных эффектов. По умолчанию выбирайте useEffect и переключайтесь на useLayoutEffect только при подтверждённом визуальном мерцании. Не используйте его в SSR без защитных проверок.
Часто задаваемые вопросы
Урок «Когда срабатывает useLayoutEffect по сравнению с useEffect» бесплатный?
Да — полный текст урока «Когда срабатывает useLayoutEffect по сравнению с useEffect» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Когда срабатывает useLayoutEffect по сравнению с useEffect»?
Узнайте, что useLayoutEffect синхронно срабатывает после изменений DOM, но до отрисовки браузером Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Когда срабатывает useLayoutEffect по сравнению с useEffect»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Фаза отображения и фиксация DOM
- Когда срабатывает useLayoutEffect по сравнению с useEffect
- Измерение элементов DOM с помощью useLayoutEffect
- Как избежать перерасчёта компоновки и визуального мерцания