📅 我们继续 50 个小项目挑战!—— IncrementingCounter组件

仓库地址:https://github.com/SunACong/50-vue-projects

项目预览地址:https://50-vue-projects.vercel.app/

在这里插入图片描述


使用 Vue 3 的 Composition API 和 <script setup> 语法结合 TailwindCSS 构建一个带有数字增长动画效果的统计卡片组件。该组件常用于展示社交媒体粉丝数、网站访问量、销售数据等可视化指标。

🎯 组件目标

  • 展示多个统计数据项(如 Twitter 关注者、YouTube 订阅数等)。
  • 数字从 0 动态增长到指定目标值。
  • 使用图标与文字搭配提升视觉识别度。
  • 使用 TailwindCSS 快速构建现代 UI 界面。
  • 添加生命周期控制防止内存泄漏。

⚙️ 技术实现点

技术点描述
Vue 3 Composition API (<script setup>)使用响应式变量管理组件状态
reactive() 响应式数组存储并更新多个统计项数据
onMounted 生命周期钩子在组件挂载后启动动画
setInterval 定时器控制数字逐步递增的过程
clearInterval避免内存泄漏,在组件卸载时清除定时器
TailwindCSS 布局与样式快速构建美观的统计卡片界面

🧱 组件实现

模板结构 <template>

<template><div class="flex h-screen items-center justify-center gap-20 text-white"><divclass="flex flex-col items-center justify-center gap-2"v-for="item in iconList":key="item.id"><img :src="item.icon" alt="icon" class="h-20 w-20" /><div class="text-3xl font-extrabold">{{ item.count }}</div><div class="font-mono">{{ item.name }}</div></div></div>
</template>

脚本逻辑 <script setup>

<script setup>
import { ref, onMounted, onUnmounted, reactive } from 'vue'const iconList = reactive([{id: 1,name: 'Twitter Followers',count: 0,icon: '/src/assets/icon/推特.svg',target: 12000,},{id: 2,name: 'Facebook Fans',count: 0,icon: '/src/assets/icon/facebook.svg',target: 5000,},{id: 3,name: 'YouTube Subscribers',count: 0,icon: '/src/assets/icon/油管.svg',target: 7000,},
])onMounted(() => {const totalSteps = 100 // 总步数const intervalDuration = 10 // 每次间隔时间(毫秒)let currentStep = 0const interval = setInterval(() => {currentStep++iconList.forEach((item) => {const stepValue = Math.ceil(item.target / totalSteps) // 每步增长的值item.count = Math.min(item.count + stepValue, item.target) // 确保不超过目标值})if (currentStep >= totalSteps) {clearInterval(interval)}}, intervalDuration)onUnmounted(() => {clearInterval(interval)})
})
</script>

🔍 重点效果实现

✅ 数字增长动画原理

通过 setInterval 设置了一个定时器,每 10ms 执行一次:

iconList.forEach((item) => {const stepValue = Math.ceil(item.target / totalSteps)item.count = Math.min(item.count + stepValue, item.target)
})
  • 将目标值平均分成 totalSteps 步;
  • 每次增加一步的数值;
  • 最终达到目标值,并停止计时器。

这样就能实现一个平滑的数字增长动画。

💡 组件卸载清理机制

为避免内存泄漏,我们在 onUnmounted 中调用 clearInterval

onUnmounted(() => {clearInterval(interval)
})

确保组件卸载时自动清除定时器。


🎨 TailwindCSS 样式重点讲解

类名作用
flex, items-center, justify-center居中布局整个容器
h-screen高度为视口全高
gap-20元素之间间距为 5rem
flex-col设置为纵向排列
h-20, w-20图标大小为 5rem × 5rem
text-3xl字体大小为 1.875rem
font-extrabold加粗字体
font-mono使用等宽字体
text-white设置文字颜色为白色

这些 Tailwind 工具类帮助我们快速构建了一个视觉清晰、层次分明的统计信息展示区域。


📁 常量定义 + 组件路由

✅ 常量定义(可选)

constants/index.js 添加组件预览常量:

{id: 15,title: 'Incrementing Counter',image: 'https://50projects50days.com/img/projects-img/15-incrementing-counter.png',link: 'IncrementingCounter',},

router/index.js 中添加路由选项:

{path: '/IncrementingCounter',name: 'IncrementingCounter',component: () => import('@/projects/IncrementingCounter.vue'),}

🏁 总结

数据统计卡片组件涵盖了Vue 3 的响应式系统、定时器控制、生命周期管理和 TailwindCSS 的灵活样式组合。


👉 下一篇,我们将完成DrinkWater组件,一个交互式的喝水记录以及达成目标的组件,具有丝滑的交互动画!🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87925.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87925.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/87925.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简约求职简历竞聘工作求职PPT模版共享

简历竞聘&#xff0c;自我介绍&#xff0c;个人简历&#xff0c;工作求职PPT模版&#xff0c;岗位竞聘求职简历PPT模版&#xff0c;低调绿自我介绍PPT模版&#xff0c;简约求职简历PPT模版&#xff0c;个人介绍PPT模版&#xff0c;我的简历PPT模版&#xff0c;个人求职简介PPT模…

Java大厂面试攻略:Spring Boot与微服务架构深度剖析

问题一&#xff1a;Spring Boot 的自动配置原理是什么&#xff1f; 简洁面试回答&#xff1a; Spring Boot 的自动配置基于条件化配置&#xff0c;通过 Conditional 注解实现&#xff0c;根据项目中依赖和环境自动装配 Bean。 详细解析&#xff1a; Spring Boot 自动配置的核…

Windows核心端口攻防全解析:135、139、445端口的技术内幕与安全实践

Windows核心端口攻防全解析&#xff1a;135、139、445端口的技术内幕与安全实践 引言&#xff1a;Windows网络通信的命脉 在Windows网络生态系统中&#xff0c;135、139和445端口犹如网络通信的"大动脉"&#xff0c;承载着关键的系统服务和网络功能。这些端口不仅是…

从生活场景学透 JavaScript 原型与原型链

一、构造函数&#xff1a;以 “人” 为例的对象工厂 1. 生活场景下的构造函数定义 我们以 “人” 为场景创建构造函数&#xff0c;每个人都有姓名、年龄等个性化属性&#xff0c;也有人类共有的特征&#xff1a; // 人类构造函数 function Person(name, age) {this.name na…

学c++ cpp 可以投递哪些岗位

此次描述知识针对应届生来说哈&#xff0c;如果是社招&#xff0c;更多是对于你目前从事的方向&#xff0c;技术栈进行招聘就好了。 此次编写是按照boss上岗位筛选的方式进行编写的&#xff0c;其实投简历一般也是用boss&#xff0c;后面也会出一篇文章给大家介绍一般找工作都用…

【Docker基础】Docker镜像管理:docker rmi、prune详解

目录 引言 1 Docker镜像管理概述 1.1 为什么需要镜像清理&#xff1f; 1.2 镜像生命周期管理 2 docker rmi命令详解 2.1 基本语法 2.2 常用选项 2.3 删除单个镜像 2.4 删除多个镜像 2.5 强制删除镜像 2.6 删除所有镜像 3 docker rmi工作原理 3.1 镜像删除流程 3.…

57-Oracle SQL Profile(23ai)实操

在上一期中说到了SQL Tuning Advisor其中一个影响对象就是SQL Profile&#xff0c;同样在管理和应用开发中,SQL性能优化是个任重道远的工作&#xff0c;低效的SQL语句让应用响应缓慢,用户整体体验下降,拖垮搞蹦整个系统都有可能。Oracle数据库提供了多种组合工具&#xff0c;有…

man的使用

man的使用 文章目录 man的使用基本用法&#xff1a;常见 man 命令操作&#xff1a;man 命令的章节&#xff1a;示例&#xff1a; man 是 Linux 和 macOS 系统中的命令&#xff0c;用于查看命令和程序的手册页&#xff08;manual pages&#xff09;。手册页包含了关于命令、函…

【蓝牙】手机连接Linux系统蓝牙配对,Linux Qt5分享PDF到手机

要实现手机连接 A40i Linux 系统并通过蓝牙接收 PDF 文件&#xff0c;可以按照以下步骤操作&#xff1a; 1. 配置 Linux 蓝牙功能 确保开发板上的蓝牙模块已正确驱动并支持蓝牙协议栈。 安装蓝牙工具&#xff1a; bash sudo apt install bluetooth bluez bluez-tools 启动蓝…

1432. 改变一个整数能得到的最大差值

1432. 改变一个整数能得到的最大差值 题目链接&#xff1a;1432. 改变一个整数能得到的最大差值 代码如下&#xff1a; class Solution { public:int maxDiff(int num) {string s to_string(num);function<int(char, char)> replace_stoi [&](char old_char, cha…

解密 Spring MVC:从 Tomcat 到 Controller 的一次完整请求之旅

今天&#xff0c;想和你聊一个我们每天都在打交道&#xff0c;但可能不曾深入思考的话题&#xff1a;当一个 HTTP 请求从浏览器发出&#xff0c;到最终被我们的 Spring Controller 处理&#xff0c;它到底经历了一场怎样的旅程&#xff1f; 理解这个流程&#xff0c;不仅仅是为…

在 Java 中操作 Map时,高效遍历和安全删除数据

在 Java 中操作 Map 时&#xff0c;高效遍历和安全删除数据可以通过以下方式实现&#xff1a; 一、遍历 Map 的 4 种高效方式 1. 传统迭代器&#xff08;Iterator&#xff09; Map<String, Integer> map new HashMap<>(); map.put("key1", 5); map.pu…

力扣-136.只出现一次的数字

题目描述 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 class Solution {public i…

Go 网络编程:HTTP服务与客户端开发

Go 在标准库中内置了功能强大的 net/http 包&#xff0c;可快速构建高并发、高性能的 HTTP 服务&#xff0c;广泛应用于微服务、Web后端、API中间层等场景。 一、快速创建一个HTTP服务 示例&#xff1a;最简Hello服务 package mainimport ("fmt""net/http&quo…

【Prism】 实现注入的几个标准化步骤(相机举例)

📸 Prism 架构中如何优雅地注册和注入相机服务 在开发基于 Prism + WPF 的应用时,合理使用依赖注入(DI)可以大大提高系统的可维护性和扩展性。本文以一个多相机平台管理系统为例,展示如何通过接口、枚举、容器注册等方式,实现相机服务的灵活配置与使用。 🧩 一、定义…

vue3组件式开发示例

1&#xff0c;定义组件&#xff08;根据实际调整提交分析结果方法&#xff09; <template><!-- 分析结果上传对话框组件 --><el-dialogv-model"uploadResultDialog":title"title":width"width":before-close"handleBeforeC…

基于arm linux的bluealsa开启蓝牙A2DP和SCO录音功能

bluealsa的软件架构 #mermaid-svg-ohITacCRHItwRR1t {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ohITacCRHItwRR1t .error-icon{fill:#552222;}#mermaid-svg-ohITacCRHItwRR1t .error-text{fill:#552222;stroke:…

网页后端开发(基础3--Springboot框架)

web的服务器资源&#xff1a; 静态资源&#xff1a;服务器上存储的不会改变的数据&#xff0c;通常不会根据用户的请求而变化。比如&#xff1a;HTML、CSS、JS、图片、视频等&#xff08;负责页面展示&#xff09; 动态资源&#xff1a;服务器端根据用户请求和其他数据…

ROS通过urdf_to_graphiz对urdf和xacro文件进行结构可视化

对机器人的urdf文件进行结构可视化&#xff1a; 举例命令如下&#xff1a; urdf_to_graphiz go2_description.urdf 输出 .gv 和 .pdf文件&#xff0c;打开 pdf文件如图&#xff1a;

基于Uniapp+PHP的教育培训系统开发指南:网校源码实战剖析

在线教育日益普及的今天&#xff0c;如何快速搭建一个功能完善、体验良好的教育培训系统&#xff0c;成为众多教育机构、培训企业、个体讲师关注的焦点。与其从零开发&#xff0c;不如基于成熟框架快速部署。而UniappPHP正是当前“低成本高效率”开发网校系统的黄金组合。 本文…