Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: useEffect, React hooks, dependencies array, side effects, component lifecycle

Что происходит при изменении зависимостей в useEffect?

Этот вопрос проверяет понимание жизненного цикла эффектов в React и того, как изменения в массиве зависимостей влияют на выполнение логики компонента.

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

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

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

Хук useEffect в React позволяет выполнять побочные эффекты в функциональных компонентах. Ключевым элементом управления его поведением является массив зависимостей, который передаётся вторым аргументом.

Как работает сравнение зависимостей

React хранит значения зависимостей из предыдущего рендера. Перед каждым рендером (включая повторные) он выполняет поверхностное сравнение (Object.is) каждого элемента массива с его предыдущим значением. Если хотя бы одно значение изменилось, триггерится последовательность:

  1. Выполняется функция очистки (cleanup) от предыдущего запуска эффекта, если она была возвращена.
  2. Запускается тело самого эффекта (синхронная функция, переданная в useEffect) заново.

Практические примеры поведения

Рассмотрим компонент, который подписывается на данные по ID пользователя.

useEffect(() => {
  console.log('Эффект выполняется для userId:', userId);
  const subscription = subscribeToUserData(userId);

  // Функция очистки
  return () => {
    console.log('Очистка для предыдущего userId:', userId);
    unsubscribeFromUserData(userId);
  };
}, [userId]); // Зависимость: userId

При первом рендере с userId=1 эффект выполнится, подписка создастся. Если в следующем рендере userId останется 1, эффект не запустится повторно. Если userId изменится на 2, React сначала выполнит функцию очистки (отпишется от данных пользователя 1), а затем запустит эффект заново, подписавшись на данные пользователя 2.

Особые случаи массива зависимостей

  • Пустой массив []: Эффект выполняется один раз после монтирования компонента, а очистка — при размонтировании. Аналог componentDidMount и componentWillUnmount.
  • Отсутствие массива: Эффект выполняется после каждого рендера компонента. Это может привести к проблемам с производительностью.
  • Объекты/массивы в зависимостях: Поскольку сравнение поверхностное, новый объект с тем же содержимым считается изменением. Это частая причина бесконечных циклов.

Вывод: Массив зависимостей в useEffect — это инструмент точного контроля над тем, когда должен выполняться побочный эффект. Его правильное использование предотвращает лишние вычисления, утечки памяти и обеспечивает актуальность данных в компоненте, синхронизируя эффекты с конкретными пропсами или состоянием.

Уровень

  • Рейтинг:

    5

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

  • React

    React

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

#useEffect

#React hooks

#dependencies array

#side effects

#component lifecycle

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