简体   繁体   English

React useState 进入死循环

[英]React useState entering infinite loop

I am using setInterval to increment the count and show it on a div like below.我正在使用 setInterval 来增加计数并将其显示在如下所示的 div 上。 I am sure that the incrementcount is working nice.我确信 incrementcount 工作正常。 Dont know what mistake I am doing.不知道我在做什么错误。

function DivClicker() {
 const [count, setCount] = React.useState<number>(0);

 function incrementCount():void{
    setCount((prev)=>prev+1);
 }
 setInterval(incrementCount,1000);

  return (
    <div>
        <div className='middle-div'>
            <div>{count}</div>
        </div>
    </div>
  )
}

export default DivClicker;

It is going crazy and incrementing hugely in matter of seconds.. Kindly guide.它正在变得疯狂,并在几秒钟内大幅增加。请指导。 Mostly it is going in an infinite loop.大多数情况下,它会进入无限循环。 I dont know why.我不知道为什么。

You're not only setting state each render - causing an infinite loop, but you're adding a new interval that sets state each render.您不仅为每个渲染设置 state - 导致无限循环,而且您添加了一个的间隔,为每个渲染设置 state。 So each time you're adding more and more infinite setStates.所以每次你添加越来越多的无限 setStates。

Fix this by setting your interval only once in a useEffect :通过在useEffect中仅设置一次间隔来解决此问题:

function DivClicker() {
 const [count, setCount] = React.useState<number>(0);

 function incrementCount():void{
    setCount((prev)=>prev+1);
 }
 
 useEffect(() => {
   const interval = setInterval(incrementCount,1000);

   return () => clearInterval(interval);
 }, []);

  return (
    <div>
        <div className='middle-div'>
            <div>{count}</div>
        </div>
    </div>
  )
}

export default DivClicker;

If you get an es-lint warning about a missing dependency, you can move incrementCount into the useEffect .如果您收到有关缺少依赖项的 es-lint 警告,您可以将incrementCount移动到useEffect中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM