当前位置:首页 > React

react实现数字滚动

2026-01-26 20:35:49React

React 实现数字滚动效果

在 React 中实现数字滚动效果可以通过多种方式完成,以下是几种常见的方法:

使用 CSS 动画

通过 CSS 的 transitionanimation 属性实现数字平滑滚动:

react实现数字滚动

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

const NumberScroller = ({ targetNumber }) => {
  const [currentNumber, setCurrentNumber] = useState(0);

  useEffect(() => {
    const duration = 2000; // 动画持续时间
    const startTime = performance.now();

    const updateNumber = (currentTime) => {
      const elapsedTime = currentTime - startTime;
      const progress = Math.min(elapsedTime / duration, 1);
      const nextNumber = Math.floor(progress * targetNumber);

      setCurrentNumber(nextNumber);

      if (progress < 1) {
        requestAnimationFrame(updateNumber);
      }
    };

    requestAnimationFrame(updateNumber);
  }, [targetNumber]);

  return <div className="number-display">{currentNumber}</div>;
};

使用第三方库

react-countup 是一个专门用于数字滚动动画的库:

import React from 'react';
import CountUp from 'react-countup';

const NumberScroller = ({ number }) => (
  <CountUp 
    end={number} 
    duration={2.5} 
    separator=","
  />
);

自定义 Hook 实现

封装一个可复用的数字滚动 Hook:

react实现数字滚动

import { useState, useEffect } from 'react';

const useNumberScroll = (target, duration = 2000) => {
  const [current, setCurrent] = useState(0);

  useEffect(() => {
    let start = null;
    const animate = (timestamp) => {
      if (!start) start = timestamp;
      const progress = timestamp - start;
      const increment = (target / duration) * progress;
      setCurrent(Math.min(increment, target));
      if (progress < duration) {
        window.requestAnimationFrame(animate);
      }
    };
    window.requestAnimationFrame(animate);
  }, [target, duration]);

  return Math.floor(current);
};

// 使用示例
const DisplayNumber = ({ value }) => {
  const displayedNumber = useNumberScroll(value);
  return <span>{displayedNumber}</span>;
};

带缓动函数的动画

添加缓动效果使滚动更自然:

const easeOutQuad = (t) => t * (2 - t);

const NumberScroller = ({ value }) => {
  const [number, setNumber] = useState(0);

  useEffect(() => {
    let start = null;
    const duration = 1500;

    const step = (timestamp) => {
      if (!start) start = timestamp;
      const elapsed = timestamp - start;
      const progress = easeOutQuad(Math.min(elapsed / duration, 1));
      setNumber(Math.floor(progress * value));

      if (elapsed < duration) {
        window.requestAnimationFrame(step);
      }
    };

    window.requestAnimationFrame(step);
  }, [value]);

  return <div>{number.toLocaleString()}</div>;
};

格式化数字显示

添加千位分隔符和单位显示:

const formatNumber = (num) => {
  if (num >= 1000000) {
    return `${(num / 1000000).toFixed(1)}M`;
  }
  if (num >= 1000) {
    return `${(num / 1000).toFixed(1)}K`;
  }
  return num.toLocaleString();
};

// 在组件中使用
const Display = ({ value }) => {
  const number = useNumberScroll(value);
  return <div>{formatNumber(number)}</div>;
};

这些方法可以根据项目需求选择使用,CSS 动画方式性能较好,第三方库实现最快捷,自定义 Hook 灵活性最高。

标签: 数字react
分享给朋友:

相关文章

react如何同步

react如何同步

React 同步状态管理方法 在 React 中实现同步状态管理,可以通过以下多种方式实现: 使用 useState 和 useEffect 钩子 通过 useState 定义状态,使用 useEf…

react 如何启动

react 如何启动

创建 React 项目 使用官方工具 create-react-app 快速初始化项目,需提前安装 Node.js(版本 ≥ 14.0.0)和 npm/yarn: npx create-react-…

如何构建react

如何构建react

构建 React 项目的步骤 安装 Node.js 和 npm 确保系统已安装 Node.js(包含 npm)。可通过命令行验证: node -v npm -v 使用 Create React Ap…

typescript react 如何

typescript react 如何

TypeScript 与 React 结合使用的方法 在 React 项目中使用 TypeScript 可以提升代码的可维护性和类型安全性。以下是一些关键步骤和最佳实践: 安装 TypeScript…

如何恢复react

如何恢复react

恢复 React 项目的方法 检查并修复依赖项 运行 npm install 或 yarn install 重新安装所有依赖项。如果依赖项损坏或缺失,这将恢复项目所需的库和工具。 恢复删除的文件 如…

react如何配置

react如何配置

配置React项目的基本步骤 安装Node.js和npm 确保系统已安装Node.js(包含npm)。可通过命令行检查版本: node -v npm -v 创建React项目 使用官方工具Creat…