【问题标题】:Javascript clearInterval with interval Id doesn't work in react js带有间隔ID的Javascript clearInterval在反应js中不起作用
【发布时间】:2021-12-30 17:04:21
【问题描述】:

我实现了一个可以正常工作的计时器,但唯一的问题是计时器结束时它不会清除Interval。

我的代码如下所示:

  const [currentCount, setCurrentCount] = React.useState(10);
  const [intervalId, setIntervalId] = React.useState(10);

  React.useEffect(() => {
    const intervalId = setInterval(timer, 1000);
    // store intervalId in the state so it can be accessed later:
    setIntervalId(intervalId);
    return () => {
      clearInterval(intervalId);
    };
  }, []);

  const timer = () => {
    setCurrentCount((prev) => {
      if (prev > 0) {
        return prev - 1;
      } else if (prev === 0) {
        console.log("Still Runs");
        clearInterval(intervalId);
        return prev;
      }
    });
  };

currentCount 的值从 10 减少到 0,但我想在它达到 0 时清除间隔,我试图用这段代码 clearInterval(intervalId) 清除它,但没有奏效。

currentCount的值达到0时如何清除Interval?

【问题讨论】:

  • 你为什么要在第 1 行再次调用 setInterval。 4 ?在 1 Line 中声明 setInterval 时完成.... [考虑表单 useEffect ! ]
  • 考虑一下这个小vanila js fiddle

标签: javascript reactjs setinterval clearinterval


【解决方案1】:

您的useEffect 挂钩在其依赖数组中缺少一个重要的依赖:timer。为了让您自己更简单,您可以将 timer 变量移到效果内部(除非您有充分的理由让它在外部)。这最终获得了额外的好处,timer 函数将能够引用间隔 ID 而无需将其保持在状态。

const [currentCount, setCurrentCount] = React.useState(10);

React.useEffect(() => {
  const timer = () => {
    setCurrentCount((prev) => {
      if (prev > 0) {
        return prev - 1;
      } else if (prev === 0) {
        console.log("Still Runs");
        clearInterval(intervalId);
        return prev;
      }
    });
  };
  const intervalId = setInterval(timer, 1000);

  return () => {
    clearInterval(intervalId);
  };
}, []);

【讨论】:

  • 非常感谢它的工作和一个快速的问题,我怎样才能从一个带有按钮 onClick 和 clearInterval 的函数运行这个间隔?
  • @MahdiFaraji 一种选择是让按钮控制计数状态,然后将计数添加到效果依赖数组中。注意,如果你的效果依赖于count变量,你可以切换setTimeout,每次只创建一个新的超时:codesandbox.io/s/cocky-ride-vej0k?file=/src/App.js
猜你喜欢
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 2021-11-29
  • 2021-05-12
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
相关资源
最近更新 更多