Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setInterval一直在执行错误的if语句_Javascript_Reactjs - Fatal编程技术网

Javascript setInterval一直在执行错误的if语句

Javascript setInterval一直在执行错误的if语句,javascript,reactjs,Javascript,Reactjs,我正在使用React钩子来构建倒计时计时器,我想使用setInterval()来减少时间,但一开始它执行正确的if语句(最后一个),但随后它继续执行,即使是错误的。我试着在控制台上记录“秒”和“分钟”,浏览器一直在显示25和0(我最初设置它们),甚至很难当我按下开始按钮时,我可以看到分钟显示另一个数字 完整代码: 我所说的准则是相关的: const[timeleft,setTimeLeft]=useState({ 会议记录:25, 秒:0, }); 常数{ 会议记录, 秒 }=时间限制; 函数h

我正在使用React钩子来构建倒计时计时器,我想使用setInterval()来减少时间,但一开始它执行正确的if语句(最后一个),但随后它继续执行,即使是错误的。我试着在控制台上记录“秒”和“分钟”,浏览器一直在显示25和0(我最初设置它们),甚至很难当我按下开始按钮时,我可以看到分钟显示另一个数字

完整代码: 我所说的准则是相关的:

const[timeleft,setTimeLeft]=useState({
会议记录:25,
秒:0,
});
常数{
会议记录,
秒
}=时间限制;
函数handleStart(){
设置开始按钮(!开始按钮);
设置间隔(()=>{
如果(秒>0){
setTimeLeft((prevValue)=>{
返回{
…价值,
秒数:prevValue.seconds-1,
};
});
}否则如果(秒===0){
如果(分钟===0){
clearInterval();
}否则{
setTimeLeft((prevValue)=>{
返回{
分钟数:prevValue.minutes-1,
秒:59,
};
});
}
}
}, 1000);
}

不,
setInterval
实际上正在做正确的事情,但您的代码可能没有做您希望它做的事情

在间隔时间内,您正在调用
setTimeLeft
setTimeLeft
会导致组件重新渲染,并且每次都会重置
setInterval


如果你想做你想做的事情,你很可能必须把这个状态拉到它自己的钩子中,或者用不同的方式来设计它。

你使用setInterval是错误的,因为它应该是这样的:

let myInterval = setInterval(() => {/* bla-bla-bla */}, 1000)
// ...
clearInterval(myInterval)
但在你的代码中我看到了:

setInterval(() => {/* bla-bla-bla */}, 1000)
// ...
clearInterval()

因此,请清除什么间隔?

react中的setInterval的问题是,它通常会使组件再次渲染,而新渲染将调用新的setInterval

这里有一篇有趣的文章提供了一个解决方案:


设置间隔不准确。。。。供参考