Это происходит потому, что useEffect
запускается после каждого рендеринга, который является вызовом функции Counter()
в этом случае функциональных компонентов без сохранения состояния. Когда вы выполняете вызов setX
, возвращенный из useState
в useEffect
, React снова отобразит этот компонент, и useEffect
снова запустится. Это вызывает бесконечный цикл:
Counter()
→ useEffect()
→ setCount()
→ Counter()
→ useEffect()
→ ... (цикл)
Чтобы ваш useEffect
запускался только один раз, передайте пустой массив []
в качестве второго аргумента, как показано в исправленном фрагменте ниже.
Целью второго аргумента является сообщить React, когда изменяется любое из значений в аргументе массива:
useEffect(() => {
setCount(100);
}, [count]); // Only re-run the effect if count changes
Вы можете передать любое количество значений в массив, и useEffect
будет работать только при изменении любого из значений. Передавая пустой массив, мы говорим React не отслеживать какие-либо изменения, только запускать один раз, эффективно имитируя componentDidMount
.
Узнайте больше о useEffect .