首页 > 其他分享 >vue3 数字自增长组件

vue3 数字自增长组件

时间:2024-12-01 14:34:24浏览次数:7  
标签:动画 currentValue const 数字 props intervalId value vue3 组件

前言

当做数字大屏的时候,就需要做一个数字传入后,可以自增长的组件,可以根据数据大小算每一次跳动的数字

运行效果

 会从0开始自动增加到9000(录屏好麻烦)

HTML
<template>
  <div class="counter">
    <div :style="{ color: fontColor, fontSize: fontSize }">
      <span
        class="num"
        :class="{ cursor: isClickable ? 'pointer' : 'default' }"
        @click="handleClick"
      >
        {{ currentValue }}
      </span>
    </div>
  </div>
</template>
JS
<script setup lang="ts">
import { ref, watch, onMounted, onBeforeUnmount } from "vue";

// 定义 props 类型
const props = defineProps<{
  // 目标值
  target: number;
  // 动画时长,默认 3000 毫秒
  duration?: number;
  // 字体颜色,默认值 'black'
  fontColor?: string;
  // 字体大小,默认值 '2rem'
  fontSize?: string;
  // 是否允许点击重新开始动画,默认为 false
  clickable?: boolean;
}>();

// 响应式变量 currentValue
const currentValue = ref<number>(0);

// 用来控制动画是否正在进行的变量
let intervalId: ReturnType<typeof setInterval> | null = null;

// 控制是否可以点击
const isClickable = ref<boolean>(props.clickable ?? true);

// 动画更新函数
const animateCounter = () => {
  const targetValue = props.target;
  const duration = props.duration ?? 3000;

  // 计算每次更新的增量,确保增量不会过小
  let step = targetValue / (duration / 10);
  if (step < 1) step = 1; // 确保最小步长为1

  // 清除之前的动画
  if (intervalId) {
    clearInterval(intervalId);
  }

  intervalId = setInterval(() => {
    currentValue.value += step;

    // 保证 currentValue 永远是整数
    currentValue.value = Math.floor(currentValue.value); // 使用 Math.floor 确保值是整数

    // 如果 currentValue 超过了 targetValue,直接设为 targetValue
    if (currentValue.value >= targetValue) {
      currentValue.value = targetValue;
      clearInterval(intervalId!);
    }
  }, 10); // 每 10 毫秒更新一次
};

// 处理点击事件,重新开始动画
const handleClick = () => {
  if (isClickable.value) {
    currentValue.value = 0;
    animateCounter();
  }
};

// 在组件挂载时启动动画
onMounted(() => {
  animateCounter();
});

// 在组件卸载前清除定时器
onBeforeUnmount(() => {
  if (intervalId) {
    clearInterval(intervalId);
  }
});

// 在组件的 target 更新时重新启动动画
watch(
  () => props.target,
  () => {
    currentValue.value = 0;
    animateCounter();
  },
  { immediate: true }
);
</script>
CSS
<style scoped>
.counter {
  font-family: Arial, sans-serif;
}

.num {
  font-weight: bold;
  cursor: pointer;
}

.num.clickable {
  cursor: pointer;
}
</style>
组件使用
 <increasing-number 
    :target="1000" 
    :duration="2000" 
    :fontColor="'red'" 
    :fontSize="'1.5rem'"
    :clickable=true
   />
参数说明类型默认值
target数字number-
duration动画完成时间number3000
fontColor字体颜色stringblack
fontSize字体大小string2rem
clickable是否可点击数字重新开始动画booleanfalse

标签:动画,currentValue,const,数字,props,intervalId,value,vue3,组件
From: https://blog.csdn.net/weixin_55237137/article/details/144139746

相关文章

  • 位运算求解LeetCode--数字范围按位与
    数字范围按位与https://leetcode.cn/problems/bitwise-and-of-numbers-range/description/思路由题目给定数据量是,约规模,可知时间复杂度O(n)是过不了的,也就是说不能使用从left到right遍历的方法来解(规模以上的O(n)就过不了)方法1:遍历n次不行,那就减少循环次数,可以让left不动......
  • 异或求解LeetCode--只出现一次的数字
    只出现一次的数字136.只出现一次的数字-力扣(LeetCode)思路根据异或的性质:0^n=n和n^n=0以及异或满足交换律和结合律可知,一个数组中偶数个相同数字异或的结果为0,奇数个相同数字异或的结果为该数字,所以要找出现奇数次的数字,只需求一下整个数组异或的结果即可代码classSo......
  • springcloud组件openFeign
    openFeign是什么?1、openFeign是个声明式WebServer客户端,使用openFeign让编写WebService客户端更加简单2、它的使用方法是定义一个服务接口然后在上面添加注解3、openFeign也支持可拔插式的编码器和解码器4、SpringCloud对openFeign进行了封装使其支持了SpringMvc标准注解......
  • 3.vue3+openlayers加载Mapbox地图
    1.注册Mapbox账户访问Mapbox官网,并点击右上角的SignUp按钮,创建一个新的账户。如果你已有Mapbox账户,可以直接登录。2.创建一个Mapbox项目登录后,进入Mapbox的AccountDashboard页面。在页面上,你会看到一个Createanewtoken或者Accesstokens的按钮。点......
  • c语言编程1.17蓝桥杯历届试题-回文数字
    题目描述观察数字:12321,123321都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。本题要求你找到一些5位或6位的十进制数字。满足如下要求:该数字的各个数位之和等于输入的整数。输入格式一个正整数n(10<n<100),表示要求满足的数......
  • 猜数字游戏
    #include<stdio.h>#include<stdlib.h>#include<time.h>voidgame(){   intr=rand()%100+1;   intguess=0;   intcount=8;   while(1){      printf("请猜一个数字:");      scanf_s("%d",&guess);      i......
  • 计算机配置 → 管理模板 → Windows 组件- 数据收集和预览版本- 允许诊断数据 ---已
    计算机配置→管理模板→Windows组件-数据收集和预览版本-允许诊断数据---已启用诊断数据关闭禁用"允许发送Windows诊断数据中的设备名称"在隐私方面的影响主要体现在以下几个方面。设备名称是Windows诊断数据的一部分,它通常包含硬件的详细信息,如计算机名称、型......
  • 第三章:MiniTomcat 之连接器(Connector)组件大揭秘:构建强大服务器的关键一步!
    第三章:MiniTomcat系列——实现连接器(Connector)组件上一章内容:第二章:解析HTTP请求,支持静态文件-MiniTomcat各位技术大神和爱好者们,今天我们要深入探索MiniTomcat中一个超级重要的组件——连接器(Connector)。它就像一座桥梁,连接着客户端与服务器,让信息在两者之间顺畅......
  • 如果要你实现一个代码(多种语言)高亮的组件,你的思路是什么?
    要实现一个前端代码高亮组件,我的思路如下:1.选择合适的库或工具:成熟的库:优先考虑使用现有的成熟库,可以节省大量开发时间和精力,并获得更好的性能和兼容性。一些流行的选择包括:highlight.js:轻量级,支持多种语言,易于集成,客户端渲染。Prism.js:轻量级,可扩展,支持多种语言,......
  • RabblitMQ 消息队列组件与 libev事件驱动库
    概述RabbitMQ是一个广泛使用的开源消息队列系统,它基于AMQP(高级消息队列协议)。RabbitMQ用于在分布式系统中传递消息,确保消息可靠传递并提供弹性。libev是一个事件驱动的库,用于高效地处理异步事件,常用于网络编程或需要高并发处理的应用。将RabbitMQ与libev结合使用,可以......