Проверяет понимание жизненного цикла эффектов в React и того, как частое изменение зависимостей влияет на количество вызовов эффекта и очистки.
В React хук useEffect запускается после рендера, когда хотя бы одна из зависимостей изменилась по сравнению с предыдущим рендером. Если значение меняется несколько раз подряд, React не «схлопывает» эти изменения: каждый новый рендер с другим значением зависимости приводит к новому циклу «очистка предыдущего эффекта → запуск нового эффекта».
Важно: React не отменяет уже запущенные асинхронные операции автоматически. Если внутри эффекта делается fetch, а зависимость меняется быстро, может возникнуть гонка запросов — ответ от старого запроса придёт позже нового и перезапишет состояние.
useEffect(() => {
const controller = new AbortController();
fetch(`/api/search?q=${query}`, { signal: controller.signal })
.then(res => res.json())
.then(setResults)
.catch(err => {
if (err.name !== 'AbortError') console.error(err);
});
return () => controller.abort(); // отменяем предыдущий запрос
}, [query]);Здесь при быстром изменении query каждый предыдущий запрос будет отменён через cleanup, и в состояние попадёт только результат последнего.
Чтобы избежать лишних срабатываний, зависимости делают примитивами, мемоизируют объекты через useMemo, функции через useCallback, а частые изменения (например, ввод) обрабатывают через debounce.
Итог: применяйте cleanup и отмену операций внутри useEffect всегда, когда эффект зависит от быстро меняющихся значений — это защищает от гонок, утечек и лишней нагрузки.
Уровень
Рейтинг:
5
Сложность:
5
Навыки
JavaScript
React
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию