当前位置:首页 > React

react实现倒计时

2026-01-27 12:54:57React

使用 useStateuseEffect 实现基础倒计时

以下是一个简单的 React 倒计时组件,从指定时间(如 60 秒)开始倒数:

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

function Countdown() {
  const [count, setCount] = useState(60);

  useEffect(() => {
    const timer = setInterval(() => {
      setCount(prevCount => (prevCount > 0 ? prevCount - 1 : 0));
    }, 1000);

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

  return <div>剩余时间: {count}秒</div>;
}

支持自定义初始时间和格式

扩展功能,允许传入初始时间并格式化显示(如 MM:SS):

function Countdown({ initialSeconds = 60 }) {
  const [seconds, setSeconds] = useState(initialSeconds);

  useEffect(() => {
    const interval = setInterval(() => {
      setSeconds(prev => (prev > 0 ? prev - 1 : 0));
    }, 1000);

    return () => clearInterval(interval);
  }, [initialSeconds]);

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

  return <div>{formatTime(seconds)}</div>;
}

添加暂停和继续功能

通过状态控制实现倒计时的暂停与继续:

function CountdownWithControls() {
  const [seconds, setSeconds] = useState(60);
  const [isActive, setIsActive] = useState(true);

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

  const toggle = () => setIsActive(!isActive);
  const reset = () => {
    setIsActive(false);
    setSeconds(60);
  };

  return (
    <div>
      <div>剩余时间: {seconds}s</div>
      <button onClick={toggle}>{isActive ? '暂停' : '继续'}</button>
      <button onClick={reset}>重置</button>
    </div>
  );
}

使用自定义 Hook 复用逻辑

将倒计时逻辑抽象为自定义 Hook useCountdown

function useCountdown(initialSeconds) {
  const [seconds, setSeconds] = useState(initialSeconds);
  const [isRunning, setIsRunning] = useState(true);

  useEffect(() => {
    if (!isRunning || seconds <= 0) return;

    const timer = setInterval(() => {
      setSeconds(prev => prev - 1);
    }, 1000);

    return () => clearInterval(timer);
  }, [isRunning, seconds]);

  const start = () => setIsRunning(true);
  const pause = () => setIsRunning(false);
  const reset = (newSeconds = initialSeconds) => {
    pause();
    setSeconds(newSeconds);
  };

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

// 使用示例
function CountdownComponent() {
  const { seconds, start, pause, reset } = useCountdown(30);

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

关键注意事项

  1. 清理定时器:在 useEffect 的清理函数中必须调用 clearInterval,防止内存泄漏。
  2. 依赖项处理:若倒计时的初始值通过 props 传入,需将其添加到 useEffect 的依赖数组中。
  3. 性能优化:对于高频更新的倒计时(如毫秒级),建议使用 requestAnimationFrame 或 Web Worker。

react实现倒计时

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

相关文章

react如何使用

react如何使用

React 的基本使用 React 是一个用于构建用户界面的 JavaScript 库,以下是一些核心概念和使用方法。 安装 React 通过 create-react-app 快速搭建 Reac…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

如何优化react

如何优化react

优化 React 性能的方法 使用 React.memo 或 PureComponent 对于函数组件,使用 React.memo 进行记忆化,避免不必要的重新渲染。类组件可以使用 PureCompo…

react如何更新

react如何更新

更新 React 版本的方法 检查当前 React 版本 运行以下命令查看项目中安装的 React 版本: npm list react 更新 React 及相关依赖 通过 npm 或 yar…

react架构如何

react架构如何

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

如何用react

如何用react

使用React的基本步骤 安装Node.js和npm 确保系统已安装Node.js和npm。Node.js自带npm,可从官网下载安装包。安装完成后,通过命令行验证版本: node -v npm -…