当前位置:首页 > 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 是一个用于构建用户界面的 JavaScript 库。学习 React 的第一步是掌握其核心概念,包括组件、状态(State)、属性(Props)和生命周期方法…

react如何调试

react如何调试

调试 React 应用的方法 使用 React Developer Tools React Developer Tools 是 Chrome 和 Firefox 的浏览器扩展,可以检查组件树、状态和…

react 如何运行

react 如何运行

运行 React 项目的步骤 安装 Node.js 确保系统已安装 Node.js(建议版本 16+),可通过官网下载并安装。安装后验证版本: node -v npm -v 创建 React 项目…

理解如何react

理解如何react

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

react如何打包

react如何打包

打包 React 项目的基本步骤 React 项目通常使用 create-react-app 或类似的脚手架工具创建,这些工具内置了打包功能。以下是打包 React 项目的详细方法: 安装依赖并构建…

react如何重置

react如何重置

重置 React 应用的状态 使用 useState 钩子重新初始化状态变量是最直接的方法。将状态变量重置为初始值或空值即可完成重置。 const [count, setCount] = useSt…