React: Зачем нужен хук useEffect и в каких случаях в него нужно передавать массив зависимостей?

Хук useEffect — один из ключевых инструментов в React, который позволяет выполнять побочные эффекты (side effects) в функциональных компонентах. Под побочными эффектами понимаются любые действия, которые выходят за рамки рендеринга: запросы к API, подписки на события, работа с таймерами, изменение заголовка страницы, взаимодействие с DOM и многое другое.

До появления хуков подобная логика размещалась в методах жизненного цикла классовых компонентов: componentDidMount, componentDidUpdate и componentWillUnmount. useEffect объединяет все три сценария в одном месте.

**Базовый синтаксис:**

useEffect(() => {
// побочный эффект
return () => {
// функция очистки (опционально)
};
}, [зависимости]);

**Массив зависимостей и его варианты:**

1. **Без массива зависимостей** — эффект выполняется после каждого рендера компонента. Это поведение аналогично componentDidUpdate. Используется редко, так как может приводить к бесконечным циклам.

2. **Пустой массив `[]`** — эффект выполняется только один раз, после первого монтирования компонента. Аналог componentDidMount. Подходит для однократных операций: загрузки начальных данных, установки подписок.

3. **Массив с зависимостями `[a, b]`** — эффект выполняется при первом рендере, а затем только тогда, когда изменится хотя бы одна из перечисленных зависимостей. Зависимостями могут быть props, state или любые переменные, используемые внутри эффекта.

**Когда передавать зависимости:**
— Если внутри useEffect используются переменные из области видимости компонента (state, props, функции), их обязательно нужно добавить в массив зависимостей. Это предотвращает использование устаревших значений (stale closure).
— Если эффект должен реагировать на изменение конкретного значения — добавьте его в массив.
— Если эффект должен выполниться только один раз — используйте пустой массив.

**Функция очистки:**
UseEffect может возвращать функцию очистки, которая вызывается перед следующим запуском эффекта или при размонтировании компонента. Это важно для отмены запросов, удаления обработчиков событий и очистки таймеров.

**Пример:**

useEffect(() => {
const subscription = props.source.subscribe();
return () => {
subscription.unsubscribe();
};
}, [props.source]);

Правильное использование массива зависимостей — залог предсказуемого поведения компонента и отсутствия утечек памяти.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.