javascript - clearInterval 在 React 功能组件中不起作用

标签 javascript reactjs

我在 React 功能组件中使用 setIntervalclearInterval。我正在增加 setInterval 内的计数,并希望在达到特定值后clearInterval。但它没有清除,不确定我做错了什么。

const { useState, useEffect } = React;

/*export default*/ function App() {
  const [chartsCount, setChartsCount] = useState(1);

  useEffect(() => {
    const chartsCountId = setInterval(() => {
      setChartsCount((count) => {
        console.log('set chart count function is running ', { chartsCount });
        if (chartsCount >= 3/*16*/) {
          console.log('We have reached the limit');
          clearInterval(chartsCountId);
        }
        return count + 1;
      });
    }, 1000);
    return () => {
      clearInterval(chartsCountId);
    };
  }, [chartsCount]);
  return (
    <div>
      <h1>Hello StackBlitz!</h1>
      <p>Start editing to see some magic happen :)</p>
    </div>
  );
}


const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.development.js"></script>

最佳答案

您应该处理 setState 之外的逻辑,因为您将 count 包含在效果的 deps 中,因此不需要在回调中读取新状态:

const { useState, useEffect } = React;

/*export default*/ function App() {
  const [chartsCount, setChartsCount] = useState(1);

  
  useEffect(() => {
    const chartsCountId = setInterval(() => {
      if (chartsCount >= 3 /*16*/ ) { // ***
        console.log('We have reached the limit');
        clearInterval(chartsCountId);
      } else {
        setChartsCount(c => c + 1);
        console.log("Current count: ", chartsCount )
      }
    }, 1000);
    return () => {
      clearInterval(chartsCountId);
    };
  }, [chartsCount]); // ***
  return (
    <div>
      <h1>Hello StackBlitz!</h1>
      <p>Start editing to see some magic happen :)</p>
    </div>
  );
}


const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.development.js"></script>

或者,如果您只想对代码进行简单快速的修复:

 setChartsCount((count) => {
        console.log('set chart count function is running ', { chartsCount });
        if (chartsCount >= 3/*16*/) {
          console.log('We have reached the limit');
          clearInterval(chartsCountId);
          return count
        }
         return count + 1;
      });

基本上,如果达到限制,您将设置相同的计数,这将防止效果再次运行。

关于javascript - clearInterval 在 React 功能组件中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72377755/

相关文章:

javascript - 通过 jquery 对 json 格式的数据使用 true/false 条件检查数据是否存在

reactjs - 如何在react-native中上传带有表单数据的图像或pdf文件?

javascript - 如何在 D3 中从 CSV 切换到 JSON? Github 类似图表

javascript - 使用 web3 将奇怪的 wei 转换为以太币

javascript - jQuery 单击事件无法使用 setInterval 替换链接

javascript - 使用 Django 进行视频聊天?或其他Python框架?

javascript - 带 setTimeout 的 slider - 'removeClass is not a function error'

reactjs - React useEffect 依赖项正在触发更新

javascript - 如何将事件处理程序传递给兄弟组件?

javascript - 是否有用于显示带有 "hole"的半透明叠加层的 React 包?