Этот вопрос проверяет понимание жизненного цикла эффектов в React и того, как изменения в массиве зависимостей влияют на выполнение логики компонента.
Хук useEffect в React позволяет выполнять побочные эффекты в функциональных компонентах. Ключевым элементом управления его поведением является массив зависимостей, который передаётся вторым аргументом.
React хранит значения зависимостей из предыдущего рендера. Перед каждым рендером (включая повторные) он выполняет поверхностное сравнение (Object.is) каждого элемента массива с его предыдущим значением. Если хотя бы одно значение изменилось, триггерится последовательность:
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 — это инструмент точного контроля над тем, когда должен выполняться побочный эффект. Его правильное использование предотвращает лишние вычисления, утечки памяти и обеспечивает актуальность данных в компоненте, синхронизируя эффекты с конкретными пропсами или состоянием.