exhaustive-deps¶
Проверяет, что массивы зависимостей хуков React содержат все нужные зависимости.
Подробности правила¶
Хуки React вроде useEffect, useMemo и useCallback принимают массивы зависимостей. Если значение, на которое есть ссылка внутри такого хука, не входит в массив зависимостей, React не перезапустит эффект и не пересчитает значение, когда эта зависимость изменится. Из-за этого возникают устаревшие замыкания: хук использует устаревшие значения.
Типичные нарушения¶
Эта ошибка часто появляется, когда React пытаются «обмануть» насчёт зависимостей, чтобы управлять тем, когда запускается эффект. Эффекты должны синхронизировать компонент с внешними системами. Массив зависимостей сообщает React, какие значения использует эффект, чтобы React знал, когда синхронизировать его заново.
Если вы спорите с линтом, код, скорее всего, нужно перестроить. Как это сделать, см. в Удаление зависимостей эффектов.
Неверно¶
Примеры неверного кода для этого правила:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Верно¶
Примеры верного кода для этого правила:
1 2 3 4 5 6 7 8 9 | |
Устранение неполадок¶
Зависимость-функция вызывает бесконечный цикл¶
Есть эффект, но на каждом рендере создаётся новая функция:
1 2 3 4 5 6 7 8 | |
В большинстве случаев эффект не нужен. Вызывайте функцию там, где происходит действие:
1 2 3 4 5 6 7 8 9 10 11 | |
Если эффект действительно нужен (например, чтобы на что-то подписаться снаружи), сделайте зависимость стабильной:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Запуск эффекта только один раз¶
Нужно запустить эффект один раз при монтировании, но линт сообщает о пропущенной зависимости:
1 2 3 4 | |
Либо включите зависимость (так и стоит делать), либо используйте реф, если запуск действительно должен быть однократным:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Параметры¶
Пользовательские хуки-эффекты можно настроить через общие параметры ESLint (доступно в eslint-plugin-react-hooks 6.1.1 и новее):
1 2 3 4 5 6 7 | |
additionalEffectHooks: регулярное выражение для пользовательских хуков, у которых нужно проверять полноту зависимостей. Эта настройка общая для всех правилreact-hooks.
Для обратной совместимости правило также принимает параметр на уровне самого правила:
1 2 3 4 5 6 7 | |
additionalHooks: регулярное выражение для хуков, у которых нужно проверять полноту зависимостей. Примечание: если задан этот параметр уровня правила, он важнее общей конфигурацииsettings.
Источник — https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps