Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: useLayoutEffect, useEffect, React hooks, lifecycle, DOM mutation

В чем разница между useLayoutEffect и useEffect?

Вопрос проверяет понимание жизненного цикла компонентов React и различий в моментах выполнения побочных эффектов, что критично для корректного управления DOM и предотвращения визуальных артефактов.

Короткий ответ

useEffect выполняется асинхронно после того, как браузер отрисовал изменения на экране. useLayoutEffect же выполняется синхронно сразу после вычисления изменений в DOM, но до их отрисовки браузером. Это делает useLayoutEffect идеальным для операций с DOM, которые должны быть завершены до визуального обновления, чтобы избежать мерцания. В большинстве случаев для запросов данных или подписок достаточно useEffect. Используйте useLayoutEffect, только если эффект напрямую меняет стили или макет, и вы видите нежелательное мерцание.

Длинный ответ

В React хуки useEffect и useLayoutEffect позволяют выполнять побочные эффекты в функциональных компонентах, но ключевое различие заключается в времени их выполнения относительно фазы отрисовки браузером.

useEffect: Асинхронное выполнение

Хук useEffect планирует выполнение переданной ему функции после того, как компонент отрендерился и браузер уже отрисовал изменения на экране. Это происходит асинхронно и не блокирует обновление интерфейса. Он идеально подходит для большинства побочных эффектов, таких как:

  • Запросы данных к API.
  • Установка и очистка подписок (например, на события).
  • Ручное изменение состояния, которое не требует мгновенного отражения в DOM.
// Пример с useEffect: измерение элемента после отрисовки
useEffect(() => {
  // Этот код выполнится ПОСЛЕ того, как пользователь увидит элемент
  const rect = elementRef.current.getBoundingClientRect();
  console.log('Размеры после отрисовки:', rect);
}, [dependencies]);

useLayoutEffect: Синхронное выполнение до отрисовки

Хук useLayoutEffect выполняется синхронно сразу после того, как React рассчитал все изменения в DOM (фаза "commit"), но до того, как браузер отрисует эти изменения на экране. Это блокирует визуальное обновление до завершения эффекта.

Его основное применение — манипуляции с DOM или стилями, которые должны быть применены до того, как пользователь увидит результат. Без этого может возникнуть видимое мерцание или скачок контента.

// Пример с useLayoutEffect: синхронное измерение и изменение стиля
useLayoutEffect(() => {
  // Этот код выполнится ДО того, как пользователь увидит элемент
  const button = buttonRef.current;
  const rect = button.getBoundingClientRect();
  // Немедленно меняем стиль на основе измерений
  if (rect.width > 200) {
    button.style.fontSize = '10px';
  }
}, [dependencies]);

Когда что использовать?

  • Используйте useEffect по умолчанию для большинства задач: запросы данных, логирование, подписки. Это безопасно и не блокирует рендеринг.
  • Используйте useLayoutEffect только когда эффект непосредственно изменяет внешний вид DOM (стили, положение, размеры) и вы наблюдаете визуальные артефакты (например, элемент сначала отображается в одном месте, а затем "прыгает" в другое).

Вывод: useLayoutEffect — это специализированный инструмент для синхронных манипуляций с DOM, необходимых для предотвращения визуального мерцания. В 90% случаев достаточно стандартного useEffect, который не блокирует отрисовку и обеспечивает лучшую производительность.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#useLayoutEffect

#useEffect

#React hooks

#lifecycle

#DOM mutation

Подпишись на React Developer в телеграм