rules-of-hooks¶
Проверяет, что компоненты и хуки следуют Правилам хуков.
Подробности правила¶
React опирается на порядок вызова хуков, чтобы правильно сохранять состояние между рендерами. При каждом рендере компонента React ожидает, что будут вызваны те же самые хуки и в том же самом порядке. Если хуки вызываются условно или в циклах, React теряет соответствие между состоянием и конкретным вызовом хука. Отсюда ошибки вроде несовпадения состояния и «Rendered fewer/more hooks than expected».
Типичные нарушения¶
Эти паттерны нарушают Правила хуков:
- Хуки в условиях (
if/else, тернарный оператор,&&/||) - Хуки в циклах (
for,while,do-while) - Хуки после раннего возврата
- Хуки в колбэках и обработчиках событий
- Хуки в async-функциях
- Хуки в методах класса
- Хуки на уровне модуля
Хук use
Хук use отличается от других хуков React. Его можно вызывать условно и в циклах:
1 2 3 4 5 6 7 8 9 | |
При этом у use остаются ограничения: - Нельзя оборачивать в try/catch - Нужно вызывать внутри компонента или хука
Подробнее: справочник API use
Неверно¶
Примеры неверного кода для этого правила:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
Верно¶
Примеры верного кода для этого правила:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Устранение неполадок¶
Нужно загрузить данные по условию¶
Вы пытаетесь вызвать useEffect условно:
1 2 3 4 5 6 | |
Вызывайте хук безусловно, а условие проверяйте внутри:
1 2 3 4 5 6 | |
Примечание
Загружать данные лучше не в useEffect. Для загрузки данных рассмотрите TanStack Query, useSWR или React Router 6.4+. Эти решения умеют убирать дубли запросов, кэшировать ответы и избегать каскада сетевых запросов.
Подробнее: Получение данных
Нужно разное состояние для разных сценариев¶
Вы пытаетесь инициализировать состояние условно:
1 2 3 4 5 6 | |
Всегда вызывайте useState, а начальное значение задавайте условно:
1 2 3 4 | |
Параметры¶
Пользовательские хуки-эффекты можно настроить через общие параметры ESLint (доступно в eslint-plugin-react-hooks 6.1.1 и новее):
1 2 3 4 5 6 7 | |
additionalEffectHooks: регулярное выражение для пользовательских хуков, которые нужно считать эффектами. ТогдаuseEffectEventи похожие функции событий можно вызывать из ваших пользовательских хуков-эффектов.
Эта общая настройка используется и правилом rules-of-hooks, и правилом exhaustive-deps, поэтому проверка хуков ведёт себя одинаково.
Источник — https://react.dev/reference/eslint-plugin-react-hooks/lints/rules-of-hooks