惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
博客园 - 【当耐特】
量子位
Engineering at Meta
Engineering at Meta
博客园_首页
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
V
Visual Studio Blog
小众软件
小众软件
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
Jina AI
Jina AI
The Cloudflare Blog
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
博客园 - 聂微东

博客园 - Zion0707

Codex接入DeepSeek token实现对话与操作,so easy! Openclaw只能聊天不能操作解决方案 Ubuntu从零搭建Openclaw Openclaw安装问题记录 react hooks实现对元素拖拽及鼠标滚轮缩放 前端实现图片文字识别并提取 ECharts实现两条曲线数据比较,数据高出区域高亮显示 canvas实现视频播放并支持自动播放 fabricjs实现虚线流动动画效果 React国际化方案及示例 fabricjs如何导入echarts fabricjs元素对齐方式实现 萤石云视频监控和回放方案 React仿photoshop参考线功能 react-router-dom v6 使用 “DatePicker”不能用作 JSX 组件。 Element plus的tree组件实现单选和搜索功能 16进制相关操作方法 js 版 AES-128 算法加解密 js 版 React 下拉多选,全选/全不选功能组件
React数字滚动,增加或减少效果
Zion0707 · 2025-01-07 · via 博客园 - Zion0707

效果:

组件:(NumberScroller.jsx)

/**
 * 数字滚动效果
 */
import React, { useEffect, useState } from 'react';
import PropTypes from 'prop-types';

const NumberScroller = ({ targetValue = 0, decimalPlaces = 0, duration = 2000 }) => {
    const [value, setValue] = useState(0);

    useEffect(() => {
        const start = performance.now();
        const interval = setInterval(() => {
            const elapsed = performance.now() - start;
            const progress = elapsed / duration;
            const newValue = value + (targetValue - value) * progress;
            setValue(newValue);

            if (progress >= 1) {
                clearInterval(interval);
                setValue(targetValue);
            }
        }, 10);

        return () => clearInterval(interval);
    }, [targetValue, duration]);

    return <div style={{ fontSize: 80 }}>{value.toFixed(decimalPlaces)}</div>;
};

NumberScroller.propTypes = {
    // 目标值
    targetValue: PropTypes.number,
    // 保留多少位小数
    decimalPlaces: PropTypes.number,
    // 滚动速率(数字越大,滚动越慢)
    duration: PropTypes.number,
};

export default NumberScroller;

测试:

import { useEffect, useState } from 'react';

import NumberScroller from './NumberScroller';

const Page = () => {
    const [targetValue, setTargetValue] = useState(Math.random() * 2000);

    useEffect(() => {}, []);

    return (
        <div className="test" style={{ padding: 20 }}>
            <NumberScroller targetValue={targetValue} />
            <button
                onClick={() => {
                    setTargetValue(Math.random() * 2000);
                }}
            >
                更改
            </button>
        </div>
    );
};

export default Page;