我是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;
答案 0 :(得分:9)
您可以为组件的状态添加间隔,并可以随时清除它。
componentDidMount(){
let intervalId = setInterval(this.yourFunction, 1000)
this.setState({ intervalId: intervalId })
}
componentWillUnmount(){
clearInterval(this.state.intervalId)
}
答案 1 :(得分:5)
您可以使用clearInterval(id)
来阻止它。您必须存储setInterval
例如
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)
})
},[])