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

React中如何实现时钟暂停与从暂停时间重启的功能

解决方案

你的核心问题在于直接存储格式化后的时间字符串,且每次更新都依赖当前系统时间,导致暂停后重启无法延续之前的时间。我们可以通过存储时间戳并手动模拟时间流逝来实现需求:

import "./App.css";
import { useEffect, useState } from "react";

function App() {
  // 存储时间戳(毫秒),初始为当前时间
  const [currentTimeStamp, setCurrentTimeStamp] = useState(Date.now());
  const [isPaused, setIsPaused] = useState(false);

  useEffect(() => {
    // 如果处于暂停状态,不启动定时器
    if (isPaused) return;

    // 每秒给时间戳加1000毫秒,模拟时间流逝
    const timer = setInterval(() => {
      setCurrentTimeStamp(prevStamp => prevStamp + 1000);
    }, 1000);

    // 组件卸载或暂停状态变化时清除定时器
    return () => clearInterval(timer);
  }, [isPaused]);

  // 将时间戳格式化为本地时间字符串
  const displayTime = new Date(currentTimeStamp).toLocaleTimeString();

  return (
    <div className="m-2 p-2 flex">
      <h1 className="m-1 p-1">{displayTime}</h1>
      <button
        className="m-1 p-2 bg-slate-200 rounded-lg shadow-lg font-semibold"
        onClick={() => setIsPaused(!isPaused)}
      >
        {isPaused ? "Start" : "Pause"}
      </button>
    </div>
  );
}

export default App;

关键逻辑说明:

  • 用时间戳存储时间:相比格式化后的字符串,时间戳更方便进行加减计算,能精准控制时间的延续。
  • 手动递增时间戳:暂停时定时器停止,时间戳不再变化;重启后定时器重新启动,时间戳每秒加1000毫秒,实现从暂停点继续计时的效果。
  • 格式化为可读时间:在渲染时将时间戳转换为本地时间字符串,不影响显示效果。

这样修改后,点击暂停按钮时钟会停在当前显示的时间,再次点击Start就会从该时间点继续走,而不是跳转到当前系统时间。

内容的提问来源于stack exchange,提问作者Md. Shadab Hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:32:53