当前位置:首页 > React

react实现计时器

2026-01-27 18:17:28React

React 实现计时器的方法

使用 useState 和 useEffect 实现基础计时器

通过 React 的 useStateuseEffect 可以轻松实现一个计时器功能。以下是一个简单的倒计时示例:

import React, { useState, useEffect } from 'react';

function Timer() {
  const [seconds, setSeconds] = useState(0);
  const [isActive, setIsActive] = useState(false);

  useEffect(() => {
    let interval = null;
    if (isActive) {
      interval = setInterval(() => {
        setSeconds(seconds => seconds + 1);
      }, 1000);
    } else if (!isActive && seconds !== 0) {
      clearInterval(interval);
    }
    return () => clearInterval(interval);
  }, [isActive, seconds]);

  return (
    <div>
      <div>计时: {seconds} 秒</div>
      <button onClick={() => setIsActive(!isActive)}>
        {isActive ? '暂停' : '开始'}
      </button>
      <button onClick={() => setSeconds(0)}>重置</button>
    </div>
  );
}

export default Timer;

实现倒计时功能

如果需要倒计时功能,可以调整初始状态和计时逻辑:

react实现计时器

import React, { useState, useEffect } from 'react';

function CountdownTimer() {
  const [timeLeft, setTimeLeft] = useState(60); // 60秒倒计时
  const [isRunning, setIsRunning] = useState(false);

  useEffect(() => {
    let timer = null;
    if (isRunning && timeLeft > 0) {
      timer = setInterval(() => {
        setTimeLeft(prevTime => prevTime - 1);
      }, 1000);
    } else if (timeLeft === 0) {
      clearInterval(timer);
    }
    return () => clearInterval(timer);
  }, [isRunning, timeLeft]);

  return (
    <div>
      <div>剩余时间: {timeLeft} 秒</div>
      <button onClick={() => setIsRunning(!isRunning)}>
        {isRunning ? '暂停' : '开始'}
      </button>
      <button onClick={() => setTimeLeft(60)}>重置</button>
    </div>
  );
}

export default CountdownTimer;

使用自定义 Hook 封装计时器逻辑

为了复用计时器逻辑,可以将其封装为自定义 Hook:

react实现计时器

import { useState, useEffect } from 'react';

function useTimer(initialTime = 0, isCountdown = false) {
  const [time, setTime] = useState(initialTime);
  const [isActive, setIsActive] = useState(false);

  useEffect(() => {
    let interval = null;
    if (isActive) {
      interval = setInterval(() => {
        setTime(prevTime => isCountdown ? prevTime - 1 : prevTime + 1);
      }, 1000);
    }
    return () => clearInterval(interval);
  }, [isActive, isCountdown]);

  const start = () => setIsActive(true);
  const pause = () => setIsActive(false);
  const reset = () => {
    setIsActive(false);
    setTime(initialTime);
  };

  return { time, start, pause, reset };
}

export default useTimer;

然后在组件中使用这个自定义 Hook:

import React from 'react';
import useTimer from './useTimer';

function TimerComponent() {
  const { time, start, pause, reset } = useTimer(0, false);

  return (
    <div>
      <div>计时: {time} 秒</div>
      <button onClick={start}>开始</button>
      <button onClick={pause}>暂停</button>
      <button onClick={reset}>重置</button>
    </div>
  );
}

export default TimerComponent;

格式化显示时间

为了更友好地显示时间,可以添加格式化函数:

function formatTime(seconds) {
  const mins = Math.floor(seconds / 60);
  const secs = seconds % 60;
  return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
}

// 在组件中使用
<div>{formatTime(time)}</div>

注意事项

  • 清除定时器很重要,否则会导致内存泄漏
  • 对于更复杂的计时器需求,可以考虑使用专门的库如 react-countdownreact-timer-hook
  • 如果需要在组件卸载时保留计时器状态,可以考虑结合 useRef 或状态管理工具

标签: 计时器react
分享给朋友:

相关文章

react如何卸载

react如何卸载

卸载 React 项目或依赖 如果需要完全卸载 React 项目或相关依赖,可以按照以下步骤操作: 删除项目文件夹 直接删除整个项目文件夹是最彻底的方式。确保已备份重要代码或配置文件。 卸载全局安…

react如何检测

react如何检测

检测 React 应用的方法 使用 PropTypes 进行类型检查 PropTypes 是 React 内置的类型检查工具,用于验证组件的 props 是否符合预期。在开发环境中,PropTypes…

react如何通信

react如何通信

React 组件通信方式 React 组件间的通信方式多样,具体选择取决于组件关系和场景需求。以下是常见方法: 父子组件通信 父组件通过 props 向子组件传递数据,子组件通过回调函数通知父组件…

odyssey react 如何

odyssey react 如何

Odyssey React 是耐克推出的一款跑鞋系列,以其轻量化设计和React泡沫缓震技术著称。以下是关于该系列鞋款的主要特点和使用建议: 核心特点 React泡沫中底提供出色的能量回馈和缓震效果…

react如何创建项目

react如何创建项目

使用 Create React App 创建项目 Create React App (CRA) 是官方推荐的 React 项目脚手架工具,适合快速初始化一个现代化的 React 项目。 安装 C…

如何设计react组件

如何设计react组件

设计 React 组件的核心原则 React 组件的设计需要遵循高内聚、低耦合的原则,确保组件功能独立且易于维护。组件的设计可以分为展示组件和容器组件两类,展示组件负责 UI 渲染,容器组件负责逻辑处…