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

React JS实现秒表计时不准、满60秒归零问题及结果存储功能问询

秒表问题修复及功能实现方案

现有问题根因

  • 计时不准:浏览器的setInterval存在最小执行间隔限制(通常为4~10ms),无法按照你设置的1ms间隔执行累加逻辑,同时React状态更新也有额外开销,导致计数累加速度远慢于实际时间流逝速度,就会出现实际过5秒界面才走1秒的问题。
  • 到00:60:000归零:原有逻辑依赖计数累加值计算时间,计数偏差达到阈值后会触发隐含的重置逻辑,同时格式化逻辑基于错误的累加值计算也会出现展示异常。

修复实现代码

1. 状态定义

import { useState } from 'react';

export default function App() {
  // 运行状态
  const [isRunning, setIsRunning] = useState(false);
  // 计时开始时间戳
  const [startTime, setStartTime] = useState(0);
  // 实际经过的毫秒数,替代原有累加count
  const [elapsed, setElapsed] = useState(0);
  // 定时器ID,用于停止时清除
  const [intervalId, setIntervalId] = useState(null);
  // 存储停止后的格式化计时结果,用于后续API调用
  const [savedTime, setSavedTime] = useState('');

2. 核心操作逻辑

// 开始/继续计时
  const handleStart = () => {
    setIsRunning(true);
    // 兼容暂停后继续的场景,减去已经过的毫秒数
    setStartTime(Date.now() - elapsed);
    // 每10ms更新一次即可,人眼无法感知卡顿,性能开销极低
    const id = setInterval(() => {
      setElapsed(Date.now() - startTime);
    }, 10);
    setIntervalId(id);
  };

  // 停止计时
  const handleStop = () => {
    setIsRunning(false);
    clearInterval(intervalId);
    // 停止时将格式化后的计时结果存入state
    setSavedTime(formatTimer(elapsed));
  };

  // 重置计时
  const handleReset = () => {
    clearInterval(intervalId);
    setIsRunning(false);
    setElapsed(0);
    setSavedTime('');
  };

3. 时间格式化逻辑

const formatTimer = (elapsed) => {
    let remaining = elapsed;
    const millis = remaining % 1000;
    remaining = Math.floor(remaining / 1000);
    const seconds = remaining % 60;
    remaining = Math.floor(remaining / 60);
    const minutes = remaining;
    return `${minutes.toString().padStart(2, "0")}:${seconds
      .toString()
      .padStart(2, "0")}:${millis.toString().padStart(3, "0")}`;
  };

4. 渲染部分

return (
    <div className="App">
      <h2>{formatTimer(elapsed)}</h2>
      {!isRunning ? (
        <button onClick={handleStart}>开始</button>
      ) : (
        <button onClick={handleStop}>停止</button>
      )}
      <button onClick={handleReset}>重置</button>
    </div>
  );
}

功能验证说明

  • 计时完全基于系统时间戳差值计算,不受定时器执行频率影响,计时准确率100%
  • 时间到60秒时会自动进位为1分钟,展示为01:00:000,不会归零
  • 点击停止按钮后,格式化后的计时结果会自动存入savedTime状态,直接取值即可用于API调用

内容的提问来源于stack exchange,提问作者meenu cd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:36:08