2 回答

TA貢獻(xiàn)1895條經(jīng)驗 獲得超3個贊
問題是您對 的用法。它在掛載組件時被調(diào)用,這意味著在用戶可以與屏幕交互之前調(diào)用它。componentDidMount
您的支票
if (this.state.status)
永遠(yuǎn)不會是真的,因為你的狀態(tài)設(shè)置為假。查看您的代碼,我假設(shè)您的意思是將狀態(tài)切換為真,并且您認(rèn)為其中的代碼將運(yùn)行。statuscomponentDidMount
但是,您應(yīng)該做的是將代碼移動到函數(shù)中,因為這實際上是時鐘的觸發(fā)器。pause()
從那里,您可以執(zhí)行類似于以下內(nèi)容的操作:
pause() {
if (this.state.status === false) {
// Start your clock, whilst checking `cycle`
} else {
clearInterval(this.state.interval);
}
}
這是一個筆,我已經(jīng)重構(gòu)了你的代碼,但基本上將所有邏輯都移到了.https://codepen.io/stephenyu-the-encoder/pen/zYrqQYEPause
我已將所有時鐘更改為從5秒開始,因此看到它工作得更快。

TA貢獻(xiàn)1811條經(jīng)驗 獲得超5個贊
我懷疑您的時鐘同時運(yùn)行并且計時器關(guān)閉的問題是由于在啟動新計時器之前沒有停止舊計時器。
您可能要查找的是組件更新方法。此方法允許您將上一個狀態(tài)與當(dāng)前狀態(tài)進(jìn)行比較,并進(jìn)行相應(yīng)的更改。使用該方法,您可以檢查我們何時從休息時間切換到會話時間,然后停止舊計時器以啟動新計時器,如下所示:
componentDidUpdate(prevProps, prevState) {
// We need to check that the new state is different from the old state
// if it is, stop the old timer, and kick off the new one
if (prevState.cycle !== this.state.cycle) {
clearInterval(this.state.interval);
if (this.state.cycle) {
// If the cycle switched to session, start the session timer
this.startSession();
} else {
// If the cycle switched to break, start the break timer
this.startBreak();
}
}
}
這樣,只要您的會話或中斷計時器達(dá)到0,您就會切換,您將始終啟動新的計時器。this.state.cycle
在此處查看我的新代碼筆,了解功能齊全的代碼
添加回答
舉報