当前位置:首页 > 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

react实现倒计时

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项目的步骤 安装Node.js和npm 确保系统已安装Node.js(包含npm)。可通过官网下载并安装最新版本。安装完成后,运行以下命令验证版本: node -v npm -v 创建…

react 如何跳转

react 如何跳转

使用 React Router 进行页面跳转 React 应用中通常使用 react-router-dom 库实现页面跳转。以下是几种常见的跳转方式: 安装依赖 npm install react…

uniapp倒计时组件

uniapp倒计时组件

uniapp倒计时组件实现方法 使用内置组件实现 uniapp提供了<countdown>组件用于倒计时功能,支持自定义格式和样式。示例代码如下: <countdown :t…

react如何检测窗口

react如何检测窗口

监听窗口大小变化 使用useEffect钩子和resize事件监听窗口尺寸变化。在组件挂载时添加事件监听器,卸载时移除监听器以避免内存泄漏。 import { useState, useEffect…

react如何切换class

react如何切换class

动态切换 React 组件的类名 在 React 中动态切换类名可以通过多种方式实现,以下是常见的几种方法: 使用模板字符串和状态管理 function MyComponent() {…

如何使用 react native

如何使用 react native

安装开发环境 确保已安装 Node.js(建议使用 LTS 版本)。通过以下命令安装 React Native 命令行工具: npm install -g expo-cli 或使用 Yarn: y…