React 类中的清除间隔

Dar*_*iad 5 javascript clearinterval ecmascript-6 reactjs

因此,我们有这个简单的 React 组件,它从父组件接收一个整数。单击该按钮后,我们会在屏幕上显示整数并开始倒计时。

问题是如何停止倒计时。在阅读其他 SO 帖子时,我发现了clearInterval(),但似乎我在这里遗漏了一些东西。

任何帮助将不胜感激。如果有人好心地向我解释为什么示例代码不能按预期工作,将获得奖励积分。

    import React from "react";

    export default class TestInterval extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                countDown: this.props.countDown, // An integer from father component
            }
        }

        timer = () => {
            setInterval(() => {
                if (this.state.countDown === 0) {
                    this.stopCountDown();
                }
                this.setState( prevState => ({
                    countDown: prevState.countDown - 1, 
                }));
            }, 1000)
        }

        startCountDown = () => {
            this.timer();
        }

        stopCountDown = () => {
            clearInterval(this.timer); // Not working
        }

        render () {
            return (
                <div>
                    <button onClick={this.startCountDown}>
                        Start Countdown
                    </button>
                    <p>{this.state.countDown}</p>
                </div>
            );
        }
    }
Run Code Online (Sandbox Code Playgroud)

Sag*_*b.g 6

您需要存储从返回的间隔引用setInterval
来自文档

它返回一个唯一标识该间隔的间隔 ID,因此您可以稍后通过调用clearInterval() 将其删除。

所以你的代码应该像这样:

this.interval = setInterval(() => {...
Run Code Online (Sandbox Code Playgroud)

然后清除它:

 clearInterval(this.interval);
Run Code Online (Sandbox Code Playgroud)

我会在状态真正设置后检查条件(setState异步),您可以在 的回调中执行此操作setState

this.interval = setInterval(() => {
      this.setState(prevState => ({
        countDown: prevState.countDown - 1,
      }), () => {
        if (this.state.countDown === 0) {
          this.stopCountDown();
        }
      });
    }, 1000)
Run Code Online (Sandbox Code Playgroud)

运行示例:

this.interval = setInterval(() => {...
Run Code Online (Sandbox Code Playgroud)
 clearInterval(this.interval);
Run Code Online (Sandbox Code Playgroud)