React中的clearInterval

时间:2017-08-24 13:17:45

标签: reactjs setinterval clearinterval

我是React的新手,我正在尝试创建一个带有启动和停止按钮的简单秒表。 我正用撞击墙壁试图通过“停止”按钮上的onClick事件来清除InterInterval。我会为setInterval声明一个变量,然后使用clearInterval清除它。不幸的是它不起作用。 有小费吗? 提前谢谢。

import React, { Component } from 'react';

class App extends Component {
  constructor(props){
    super(props);
    this.state = {time:0}

    this.startHandler = this.startHandler.bind(this);
  }

  getSeconds(time){
    return `0${time%60}`.slice(-2);
  }

  getMinutes(time){
    return Math.floor(time/60);
  }

  startHandler() {
      setInterval(()=>{
      this.setState({time:this.state.time + 1});
    },1000)

  }

  stopHandler() {
    //HOW TO CLEAR INTERVAL HERE????
  }

  render () {
    return (
      <div>
        <h1>{this.getMinutes(this.state.time)}:{this.getSeconds(this.state.time)}</h1>
        <button onClick = {this.startHandler}>START</button>
        <button onClick = {this.stopHandler}>STOP</button>
        <button>RESET</button>
      </div>
    );
  }
}

export default App;

4 个答案:

答案 0 :(得分:9)

您可以为组件的状态添加间隔,并可以随时清除它。

componentDidMount(){
  let intervalId = setInterval(this.yourFunction, 1000)
  this.setState({ intervalId: intervalId })
}

componentWillUnmount(){
  clearInterval(this.state.intervalId)
}

答案 1 :(得分:5)

您可以使用clearInterval(id)来阻止它。您必须存储setInterval例如

的ID
const id = setInterval(() = > {
    this.setState({
        time: this.state.time + 1
    });
}, 1000)
clearInterval(id);

答案 2 :(得分:4)

在你的startHandler函数中,你可以这样做:

    this.myInterval = setInterval(()=>{
      this.setState({ time: this.state.time + 1 });
    }, 1000);

并在您的 stopInterval()中执行clearInterval(this.myInterval);

答案 3 :(得分:1)

您可以在setTimeout内部使用useEffect,而无需依赖,因此在启动组件时调用一次,然后在卸载组件时调用clearInterval

useEffect(() => {
    let intervalId = setInterval(executingFunction,1000)
    return(() => {
        clearInterval(intervalId)
    })
},[])