如何在useEffect中停止无限循环?

Posted

技术标签:

【中文标题】如何在useEffect中停止无限循环?【英文标题】:How to stop infinity loop inside useEffect? 【发布时间】:2021-12-05 06:00:22 【问题描述】:

我需要将类组件转换为功能组件, 当我转换它时,它给了我一个无限循环。我怎样才能停止这个循环?

类组件ComponentDidMount代码

componentDidMount() 
  setInterval(this.moveSnake, this.state.speed);
  document.onkeydown = this.onKeyDown;

我为上面的 ComponentDidMount 编写的功能组件

useEffect(()=>
  document.onkeydown = onKeyDown
  const interval = setInterval(() => 
    moveSnake()
   , 200);
   return () => clearInterval(interval);
,[]);



const moveSnake = ()=>
  let dots = [...snake];
  let head = dots[dots.length-1];

  switch(direction)
    case "RIGHT":
      head = [head[0]+2, head[1]];
      break;
    case "LEFT":
      head = [head[0]-2, head[1]];
      break;
    case "UP":
      head = [head[0], head[1]-2];
      break;
    case "DOWN":
      head = [head[0], head[1]+2];
      break;
  

  dots.push(head);
  dots.shift();

  setSnake(dots);
  console.log(dots);

【问题讨论】:

请分享你在setInterval中运行的函数的代码 @SinanYaman 当然我会更新它 您的代码对我来说似乎很好。你能创建一个codesandbox 复制这个bug,它会更容易修复。现在这个问题对我来说并不明显。 【参考方案1】:

useEffect 中返回后,您有一条永远不会运行的行:

document.onkeydown = onKeyDown;

【讨论】:

我把它改成了函数的顶部。它现在运行。 这不是答案,而是评论。 我同意@SinanYaman,但我不会写 cmets。 哦,我明白了。不记得那个限制了。

以上是关于如何在useEffect中停止无限循环?的主要内容,如果未能解决你的问题,请参考以下文章

面试官:如何解决React useEffect钩子带来的无限循环问题

尽管依赖项没有变化,useEffect 运行无限循环

如何避免“React Hook useEffect 缺少依赖项”和无限循环

React hook useEffect 永远/无限循环连续运行

从 api 获取时反应 useEffect 无限循环

useEffect 中的无限循环