当前位置:首页 > 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 native如何启动

react native如何启动

React Native 启动步骤 确保已安装 Node.js(建议版本 14 或更高)和 npm/yarn。安装完成后,通过命令行工具执行以下操作。 初始化新项目 使用 React Native…

如何学react

如何学react

学习 React 的基础知识 React 是一个用于构建用户界面的 JavaScript 库。学习 React 的第一步是掌握其核心概念,包括组件、状态(State)、属性(Props)和生命周期方法…

react 如何引入jquery

react 如何引入jquery

引入 jQuery 到 React 项目 在 React 项目中引入 jQuery 可以通过多种方式实现,但需要注意 React 和 jQuery 操作 DOM 的方式可能冲突,因此建议仅在必要时使用…

react如何更新

react如何更新

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

如何提高react

如何提高react

优化性能 使用React.memo对组件进行记忆化处理,避免不必要的重新渲染。对于类组件,可以使用PureComponent来达到类似效果。 利用useMemo缓存计算结果,避免重复计算。对于函数或…

react如何注销

react如何注销

React 组件的注销方法 在 React 中,组件的注销通常指的是在组件卸载时执行清理操作,例如取消订阅、清除定时器或释放资源。以下是几种常见的方法: 使用 useEffect 钩子的清理函数…