Это из-за объема. Вы понимаете, что массив - это элемент, который помогает useEffect
обновить реквизиты или состояние, используемое внутри анонимной функции. В вашем случае iChangeEverySecond
- это реквизит, поэтому он «должен», не обязательно быть в массиве, потому что используется внутри функции.
Я оставляю вам полное объяснение, извлеченное из веб-сайта реагирования.
Если вы используете эту оптимизацию, убедитесь, что в массив включены все значения из области действия компонента (например, реквизиты и состояние), которые меняются со временем и используются эффектом. В противном случае ваш код будет ссылаться на устаревшие значения из предыдущих рендеров. Узнайте больше о том, как обращаться с функциями и что делать, если значения массива меняются слишком часто.
Если вы хотите запустить эффект и очистить его только один раз (при монтировании и размонтировании), вы можете передать пустой массив ([]) в качестве второго аргумента. Это говорит React, что ваш эффект не зависит от каких-либо значений из реквизита или состояния, поэтому его не нужно повторно запускать. Это не обрабатывается как особый случай - это следует непосредственно из того, как всегда работает массив зависимостей.
Если вы передадите пустой массив ([]), реквизиты и состояние внутри эффекта всегда будут иметь свои начальные значения. ценности. Хотя передача [] в качестве второго аргумента ближе к знакомой ментальной модели componentDidMount и componentWillUnmount, обычно существуют лучшие решения, позволяющие избежать слишком частого повторного запуска эффектов. Кроме того, не забывайте, что React откладывает запуск useEffect до того, как браузер нарисовал, поэтому выполнение дополнительной работы - не проблема.
Мы рекомендуем использовать правило исчерпывающего ввода-вывода как часть нашего eslint-plugin- пакет реактивных крючков. Он предупреждает, что зависимости указаны неверно, и предлагает исправление.