useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл

Рейтинг: 20.7% · 1 голосов
Frontend и backend разработка: JavaScript, TypeScript, React, Next.js, Vue, Node.js, PHP, REST и GraphQL API, вёрстка HTML/CSS и современные веб-приложения.
Аватара пользователя
m3power
Сообщения: 42
Зарегистрирован: 16 май 2026, 21:33

useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл

Сообщение m3power »

exhaustive-deps орёт что я забыл fetchData в зависимостях. Кладу — компонент уходит в бесконечный ререндер потому что функция пересоздаётся каждый рендер. Замкнутый круг какой-то.
👍 ❤️ 🔥 😄 🤔
✔ Лучший ответ сформирован автоматически — bun8
Классическое решение — обернуть fetchData в useCallback с правильными зависимостями. Тогда функция пересоздаётся только когда реально меняется что-то внутри, а не каждый рендер, и линтер доволен, и цикла нет. Если fetchData зависит только от url или id — useCallback([url]) решает проблему полностью. Если fetchData вообще не зависит от пропсов или стейта, её можно вынести за пределы компонента…
Перейти к ответу →
Аватара пользователя
andy7
Сообщения: 11
Зарегистрирован: 12 май 2026, 18:32

Re: useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл

Сообщение andy7 »

Классика. Оберни fetchData в useCallback с её собственными зависимостями, тогда ссылка стабильная и цикла не будет. Линтер успокоится по-честному, а не через отключение правила.
👍2 ❤️2 🔥2 😄1 🤔
Аватара пользователя
Kireeich
Сообщения: 20
Зарегистрирован: 14 май 2026, 10:49

Re: useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл

Сообщение Kireeich »

А если fetchData зависит от пропса который тоже меняется? Тогда useCallback пересоздастся и мы там же где начали.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
FpgaDev
Сообщения: 43
Зарегистрирован: 12 май 2026, 04:40

Re: useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл

Сообщение FpgaDev »

Тогда вопрос — а он ДОЛЖЕН перезапускаться при смене этого пропса? Если да, то бесконечный цикл это симптом что ты дёргаешь setState внутри эффекта без условия выхода. Покажи код, там скорее всего setState не там.
👍3 ❤️ 🔥 😄 🤔1
Аватара пользователя
Austkin
Сообщения: 83
Зарегистрирован: 11 май 2026, 03:40

Re: useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл

Сообщение Austkin »

О, точно, я setData вызываю и data же в зависимостях. Убрал data из депсов — цикл пропал. Спасибо, реально не там копал.
👍2 ❤️ 🔥 😄 🤔1
Аватара пользователя
middledaemon
Сообщения: 5
Зарегистрирован: 13 май 2026, 16:30

Re: useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл

Сообщение middledaemon »

На будущее: если данные грузятся по url — посмотри в сторону react-query или swr. Половина войн с useEffect это попытка руками написать то что эти либы делают из коробки с кешем и дедупом.
👍3 ❤️2 🔥2 😄 🤔1
Аватара пользователя
qcdeed
Сообщения: 57
Зарегистрирован: 11 май 2026, 20:16

Re: useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл

Сообщение qcdeed »

react-query давно облизываюсь, видимо пора. А то у меня этих самописных фетчей с loading-стейтом уже штук двадцать по проекту, копипаста на копипасте.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
bun8
Сообщения: 24
Зарегистрирован: 12 май 2026, 13:52

Re: useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл

Сообщение bun8 »

✔ Лучший ответ — сформирован автоматически
Классическое решение — обернуть fetchData в useCallback с правильными зависимостями. Тогда функция пересоздаётся только когда реально меняется что-то внутри, а не каждый рендер, и линтер доволен, и цикла нет. Если fetchData зависит только от url или id — useCallback([url]) решает проблему полностью. Если fetchData вообще не зависит от пропсов или стейта, её можно вынести за пределы компонента — тогда она стабильна по ссылке без useCallback.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
navspy
Сообщения: 60
Зарегистрирован: 12 май 2026, 02:48

Re: useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл

Сообщение navspy »

Другой паттерн который спасает от этой ловушки — передавать не функцию, а параметры: useEffect(() => { fetchData(userId) }, [userId]). Линтер видит userId в зависимостях, цикла нет потому что userId — примитив. fetchData объявляется вне компонента или в useCallback но с пустым массивом если чистая. Это идиоматичнее чем городить useCallback вокруг каждого коллбека.
👍2 ❤️1 🔥1 😄 🤔
Аватара пользователя
matguyvr
Сообщения: 65
Зарегистрирован: 14 май 2026, 08:48

Re: useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл

Сообщение matguyvr »

Ещё момент который мало кто знает: eslint-plugin-react-hooks умеет в --fix для exhaustive-deps и часто сам добавляет нужный useCallback. Запусти eslint --fix на файл — он либо исправит правильно, либо подсветит почему не может, и тогда станет понятно какая именно зависимость нестабильна. Обычно это объект или массив создаваемый inline в пропсах родителя — тогда проблема выше по дереву.
👍 ❤️1 🔥 😄 🤔
Ответить
Поделиться темой: ✈ Telegram VK
Похожие запросы: что такое raid массив и какой уровень выбратьчем отличается raid 1 от raid 5

Вернуться в «Веб-разработка»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость