【发布时间】:2020-10-02 15:38:15
【问题描述】:
所以我有这个问题,我不知道这是一个错误的概念还是该概念的错误实施。 我在 freecodecamp.org 中做番茄钟,这迫使我在纯 js 和 React 组件中使用 setInterval() 函数。
在 Pomodoro 组件内部,每次它被挂载到 DOM 树中时,都应该运行 setInterval 检查状态并根据组件的状态进行计时。事实上,我可以看到状态变量发生了变化(感谢 React 调试工具),但间隔不起作用
componentdidmount 在将组件渲染到 DOM 树中后运行并检查 state.status,如果它为 true,则检查要运行的周期,是会话还是中断时钟。一个计时器结束后,另一个应该立即启动。
这个计时器或间隔存储在组件状态中,然后从 this.state.interval 状态中清除。
class Pomodoro extends React.Component {
constructor(props) {
super(props);
this.state = {
session:1500,
break:300,
cycle:true,
status:false,
sessionClock:1500,
breakClock:300,
interval:0,
}
this.addSessionTime = this.addSessionTime.bind(this);
this.decSessionTime = this.decSessionTime.bind(this);
this.addBreakTime = this.addBreakTime.bind(this);
this.decBreakTime = this.decBreakTime.bind(this);
this.pause = this.pause.bind(this);
this.reset = this.reset.bind(this);
}
/*Avoided all the other binded functions since they are just setStates*/
componentDidMount() {
if (this.state.status)
{
if (this.state.cycle /* cycle true = session */)
{
this.setState({
interval:(setInterval( ()=> {
if (!this.state.status/*status true = clock running*/ ) {clearInterval(this.state.interval);}
else
{/*begin session clock*/
if (this.state.sessionClock > 1 /*check if is the last second*/)
{
this.setState({sessionClock: this.state.sessionClock - 1});
/*take away a second from sessionClock*/
}
else {this.setState({cycle:!this.state.cycle, sessionClock:this.state.session}) }
} /*change cycle and restart sessionclock*/
}
,1000)
)})}
else /*cycle off = break time*/
{
this.setState({interval: setInterval(()=>{
if (!this.state.status) {clearInterval(this.state.interval)}
else {
/*begin break clock*/
if (this.state.breakClock > 1)
{this.setState({breakClock:this.state.breakClock - 1})}
else {this.setState({cycle:!this.state.cycle, breakClock:this.state.break})}
}
},1000)})
}
}
else { clearInterval(this.state.interval)}
}
由于将 setInterval 保存到组件状态或其他原因导致时钟不工作?
编辑
添加了一个代码笔,以便您可以看到实时版本和状态变化
https://codepen.io/bigclown/pen/bGEpJZb
编辑二
删除了 componentdidmount 方法并将内容移至 pause() 方法,但现在两个时钟同时运行并且时钟运行速度比预期的快(可能是来自 react 中的异步状态更新的问题?)
【问题讨论】:
-
那么“时钟不工作”究竟是什么意思?不算数吗?不显示?不是从工作转移到休息吗?
-
不计算既不移动也不暂停播放
-
存储对区间的引用很好,这就是你正在做的——你不是在存储箭头函数。不过,我觉得咖啡很难推理。
-
感谢@DaveNewton 指出错误,“我觉得咖啡很难推理”是什么意思?
-
cDM在安装时被调用一次。 “咖啡”是“代码”的自动更正。我看不懂你的代码。公平地说,我也看不懂你的咖啡,但这不太重要。代码倒转并不能说明它有多棒;)圈复杂度会扼杀理解。
标签: javascript reactjs