我在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問題本身,但是其他的東西是組件的屬性而不是它的狀態或道具? (除了方法) –