2 回答
TA贡献1155条经验 获得超0个赞
目前您使用useState挂钩来存储区间参考。在每次重新渲染组件时,App状态fun都会被重置,但不会是对间隔的完全相同的引用。
而是使用useRef钩子。它可以创建对间隔的引用,该间隔在重新渲染期间不会更改。这意味着引用属性中的值current将始终完全相同。
最重要的是,使用useEffect钩子来观察何时设置或取消设置运行状态,并根据该状态启动和停止计时器。
import React, { useState, useRef, useEffect } from 'react'
export default function App() {
const [isRunning, setIsRunning] = useState(false);
const funRef = useRef(null);
const startTimer = () => {
if (!isRunning) {
setIsRunning(true);
}
};
const stopTimer = () {
if (isRunning && funRef.current !== null) {
setIsRunning(false);
}
};
useEffect(() => {
if (isRunning) {
funRef.current = setInterval(() => { // Save reference to interval.
// ...
}, 1000);
} else {
clearInterval(funRef.current); // Stop the interval.
}
}, [isRunning]);
// ...
}
TA贡献1788条经验 获得超4个赞
在 useEffect 块中添加间隔计时器,并在每次开始更改时运行此块:
useEffect(()=> {
let timer = null;
if(!start) {
let sec = seconds;
timer = setInterval(() => {
console.log("akak:", sec);
if (sec <= 0) clearInterval(timer);
setSeconds(sec--);
}, 1000);
} else {
clearInterval(timer);
}
}, [start]);
const startTimer = () => {
setStartToggle(false);
};
const stopTimer = () => {
setStartToggle(true);
};
另外,我建议您使用确切的剩余时间。Javascript 是单线程语言,这个间隔可能超过一秒
编辑:使用确切的时间。
useEffect(() => {
let timer = null;
if (!start) {
let sec = seconds;
const startTime = Date.now();
timer = setInterval(() => {
const currentTime = Date.now();
sec = sec - Math.floor((currentTime - startTime) / 1000);
if (sec < 0) {
clearInterval(timer);
setSeconds(0);
} else {
setSeconds(sec);
}
}, 1000);
}
}, [start]);
添加回答
举报