当前位置:首页 > 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 的收录主要涉及搜索引擎优化(SEO)和预渲染技术。由于 React 是单页应用(SPA),默认情况下内容由 JavaScript 动态生成,可能导致搜索引擎爬虫难以收…

react如何遍历

react如何遍历

遍历数组或对象的方法 在React中,遍历数组或对象通常用于渲染列表或动态生成内容。以下是几种常见的遍历方法: 使用map遍历数组map是遍历数组并返回新数组的高阶函数,适合渲染列表。…

如何运行react

如何运行react

运行 React 项目的步骤 安装 Node.js 和 npm 确保系统已安装 Node.js(包含 npm)。可通过官网 Node.js 下载并安装最新稳定版本。安装完成后,验证版本: node…

react如何创建框架

react如何创建框架

React 创建框架的方法 React 本身是一个用于构建用户界面的 JavaScript 库,但可以通过多种方式创建框架或项目结构。以下是几种常见的方法: 使用 Create React App…

如何编译react文件

如何编译react文件

编译 React 文件的方法 使用 Create React App (CRA) Create React App 是官方推荐的快速搭建 React 项目的工具,内置了 Babel 和 Webpack…

react如何引入图片

react如何引入图片

在React中引入图片的方法 使用import直接引入 将图片文件放在项目src目录下(如src/images),通过ES6的import语法引入: import logo from './…