当前位置:首页 > 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 版本 在项目根目录的 package.json 文件中查看 react 和 react-dom 的版本号。也可以通过命令行运行以下命令查看: np…

react native如何启动

react native如何启动

如何启动 React Native 项目 安装 Node.js 和 npm 确保已安装 Node.js(建议版本 16 或更高)和 npm(Node.js 自带)。可通过以下命令检查版本: node…

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修改…

react如何运行

react如何运行

运行React项目的步骤 安装Node.js 确保系统已安装Node.js(建议版本12以上),可从官网下载并安装。Node.js自带npm包管理器,用于后续依赖安装。 创建React项目 使用官…

react架构如何

react架构如何

React 架构核心概念 React 的架构围绕组件化、虚拟 DOM 和单向数据流设计。组件是构建用户界面的独立模块,分为函数组件和类组件。虚拟 DOM 通过高效的 Diff 算法减少直接操作真实 D…

理解如何react

理解如何react

理解React的核心概念 React是一个用于构建用户界面的JavaScript库,专注于通过组件化开发提高代码的可维护性和复用性。其核心思想包括虚拟DOM(Virtual DOM)和单向数据流,能够…