You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React页面刷新时如何让计时器从零开始

解决页面刷新时计时器从零开始的问题

你的代码问题在于依赖系统当前时间的分钟和秒数计算剩余时间,而非以页面加载时刻为起点计时,所以刷新后无法从零开始。要实现页面刷新时计时器从零启动,需要以页面加载时的时间戳为基准计算流逝时间。

倒计时场景(6分钟倒计时)

如果需求是6分钟倒计时,刷新页面后从6:00开始倒计,修改后的代码如下:

const [timer, setTimer] = useState("6:00");

useEffect(() => {
  // 记录页面加载时的初始时间戳
  const startTime = Date.now();
  const intervalId = setInterval(() => {
    // 计算从页面加载到当前的毫秒数差
    const elapsedMs = Date.now() - startTime;
    // 转换为已流逝的秒数
    const elapsedSeconds = Math.floor(elapsedMs / 1000);
    // 总倒计时时长(6分钟=360秒)
    const totalTime = 6 * 60;
    // 计算剩余秒数
    const remainingSeconds = totalTime - elapsedSeconds;

    // 剩余时间为0时停止计时器
    if (remainingSeconds <= 0) {
      clearInterval(intervalId);
      setTimer("0:00");
      return;
    }

    // 格式化分钟和秒数,秒数不足10补0
    const minutes = Math.floor(remainingSeconds / 60);
    const seconds = remainingSeconds % 60;
    const formattedTimer = `${minutes}:${seconds.toString().padStart(2, '0')}`;
    
    setTimer(formattedTimer);
  }, 1000);

  // 组件卸载时清除计时器
  return () => clearInterval(intervalId);
}, []);

正计时场景(从零开始累加)

如果是需要从0开始往上计时,代码可以简化为:

const [timer, setTimer] = useState("0:00");

useEffect(() => {
  const startTime = Date.now();
  const intervalId = setInterval(() => {
    const elapsedMs = Date.now() - startTime;
    const elapsedSeconds = Math.floor(elapsedMs / 1000);
    const minutes = Math.floor(elapsedSeconds / 60);
    const seconds = elapsedSeconds % 60;
    const formattedTimer = `${minutes}:${seconds.toString().padStart(2, '0')}`;
    setTimer(formattedTimer);
  }, 1000);

  return () => clearInterval(intervalId);
}, []);

关键修改点

  • 以页面加载时的startTime为基准,不再依赖系统当前时间的分钟/秒数
  • 用时间戳差值计算精确的流逝时间,保证刷新后从零开始
  • 增加秒数补0逻辑,统一显示格式(如0:05而非0:5)
  • 倒计时场景中增加了时间到点后停止计时器的逻辑

内容的提问来源于stack exchange,提问作者fullstack dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 07:17:30