我在React组件中有一个使用setInterval()
的计时器,我不确定最佳实践是如何使用state
来启动和停止此间隔。我遇到了一些异步问题。setInterval和React中的setState
比方说,我有一组链接在渲染和罚款执行回调我的阵营组成:
let links = [10, 50, 100, 500, 1000].map((num) => {
return(
<Link key={num} onClick={(e) => this.switchNums(num)} to={`/somePath/${num}`}>{num}</Link>
)
})
这里的switchNums()
功能,在这里我希望它重置现有的计时器:
switchNums(num){
this.stopTimer()
this.reset(num)
}
这里的startTimer()
,stopTimer()
和reset()
:
startTimer(){
if(!this.state.timerId){
let timerId = setInterval(()=>{
let timer = this.state.timer + 1
this.setState({
timer: timer,
timerId: timerId
})
}, 1000)
}
}
stopTimer(){
clearInterval(this.state.timerId)
this.setState({timerId:null})
}
reset(size){
this.setState({
gameOver: false,
counter: 0,
correct: 0,
numbers: this.getRandomNumbers(size),
timer: 0
}, this.startTimer())
}
尽管startTimer()
中有if
条件,但其中一个错误是快速点击链接将导致多个间隔点火。我猜这与setState()
的异步性质有关。另一个错误(我认为是相关的)是,当我慢点击时,它只会在其他时间开始间隔。
谁能一些线索呢?或者他们已经做了什么来避免异步问题setState
与setInterval
(任何方式设置状态可以返回承诺吗?)一起使用,或者哪种生命周期方法最适合这种类型的情况?
我的天啊,你可以把东西存储在组件本身中......谢谢!要试试 –
当然。让我知道它是否有效。 – Chris
非常感谢你!这工作完美。所以这可能是另一个SO问题本身,但是其他的东西是组件的属性而不是它的状态或道具? (除了方法) –