2 回答
TA贡献1895条经验 获得超3个赞
问题是您对 的用法。它在挂载组件时被调用,这意味着在用户可以与屏幕交互之前调用它。componentDidMount
您的支票
if (this.state.status)
永远不会是真的,因为你的状态设置为假。查看您的代码,我假设您的意思是将状态切换为真,并且您认为其中的代码将运行。statuscomponentDidMount
但是,您应该做的是将代码移动到函数中,因为这实际上是时钟的触发器。pause()
从那里,您可以执行类似于以下内容的操作:
pause() {
if (this.state.status === false) {
// Start your clock, whilst checking `cycle`
} else {
clearInterval(this.state.interval);
}
}
这是一个笔,我已经重构了你的代码,但基本上将所有逻辑都移到了.https://codepen.io/stephenyu-the-encoder/pen/zYrqQYEPause
我已将所有时钟更改为从5秒开始,因此看到它工作得更快。
TA贡献1811条经验 获得超5个赞
我怀疑您的时钟同时运行并且计时器关闭的问题是由于在启动新计时器之前没有停止旧计时器。
您可能要查找的是组件更新方法。此方法允许您将上一个状态与当前状态进行比较,并进行相应的更改。使用该方法,您可以检查我们何时从休息时间切换到会话时间,然后停止旧计时器以启动新计时器,如下所示:
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();
}
}
}
这样,只要您的会话或中断计时器达到0,您就会切换,您将始终启动新的计时器。this.state.cycle
在此处查看我的新代码笔,了解功能齐全的代码
添加回答
举报