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]);
添加回答
舉報