Вопрос проверяет понимание различий между эффектами в React и их влияния на рендеринг и визуальную стабильность интерфейса.
useLayoutEffect выполняется синхронно после изменения DOM, но до отображения UI пользователю. Это позволяет читать размеры элементов и сразу вносить изменения без визуального мерцания. В отличие от useEffect, он блокирует отрисовку. Использовать его нужно осторожно. Обычно он нужен для работы с layout и измерениями.
useLayoutEffect предназначен для ситуаций, когда важно повлиять на DOM до того, как браузер отрисует кадр.
Жизненный цикл выглядит следующим образом:
React обновляет DOM
выполняется useLayoutEffect
браузер рисует экран
За счёт этого пользователь не видит промежуточных состояний интерфейса.
Измерение размеров элементов
getBoundingClientRect
вычисление позиций
Синхронные правки layout
корректировка скролла
устранение скачков интерфейса
Пример:
useLayoutEffect(() => {
const height = ref.current.offsetHeight
// использование размера до отрисовки
}, [])
useEffect не блокирует рендер
useLayoutEffect выполняется синхронно
неправильное использование может ухудшить производительность
для запросов к API
для логики, не связанной с DOM
по умолчанию, «на всякий случай»
useLayoutEffect нужен для точечного контроля отображения UI. Его используют только тогда, когда useEffect приводит к визуальным артефактам.