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)
您需要存储从返回的间隔引用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)
归档时间: |
|
查看次数: |
5859 次 |
最近记录: |