当前位置: 首页 > news >正文

前端 vite+vue3——写一个随机抽奖组件

文章目录

    • ⭐前言
    • ⭐设计布局
    • ⭐交互设计
    • ⭐整体代码
      • ⭐insicode代码
    • ⭐总结
    • ⭐结束

yma16-logo

⭐前言

大家好,我是yma16,本文分享关于前端 vite+vue3——写一个抽奖随机组件。
vue3系列相关文章:
前端vue2、vue3去掉url路由“ # ”号——nginx配置
csdn新星计划vue3+ts+antd赛道——利用inscode搭建vue3(ts)+antd前端模板
认识vite_vue3 初始化项目到打包
python_selenuim获取csdn新星赛道选手所在城市用echarts地图显示

vue3
Vue3是Vue.js框架的下一个主要版本。Vue3的目标是提高性能,增强可维护性和可扩展性,并提供更好的TypeScript支持。

以下是Vue3的一些主要特点:

  1. 性能提升:Vue3可以在运行时进行优化,从而实现更快的渲染速度和更小的文件大小。

  2. 更好的TypeScript支持:Vue3的API和内部结构已更新,从而更好地支持TypeScript类型检查。

  3. Composition API:Vue3的Composition API通过提供更灵活的组件逻辑组织方式来改进代码重用性和可维护性。

  4. 更好的可扩展性:Vue3的内部结构已更新,从而更好地支持插件和第三方库。

  5. 更好的开发体验:Vue3提供了更好的开发工具和调试工具,从而提高了开发效率和质量。

总之,Vue3是一个更加灵活、高效和易于使用的Vue框架版本,它将成为Vue.js社区中的重要组成部分。
抽奖效果
draw

⭐设计布局

结构:上中下结构
上方显示 用户头像列表
中奖 显示抽奖过程中的用户头像
下方显示 开始抽奖按钮

结束抽奖时,弹出弹框
布局代码

<template><div><!-- 抽奖用户 列表 --><div v-for="item in state.list" :key="item.id" style="display: inline-block;padding:20px"><div style="display: inline-block;text-align: center;"><div>{{ item.name }}</div><div><a-avatar :size="{ xs: 24, sm: 32, md: 40, lg: 64, xl: 80, xxl: 100 }"><template #icon><img :src="item.img"></template></a-avatar></div></div></div><!-- 抽奖用户 随机旋转的用户--><!-- 0.5s 游戏开始不断轮播用户头像  --><div style="display: flex;justify-content: center;align-items: center;margin-top:50px"v-if="state.gameStatus !== 'init'"><div style="display: inline-block;text-align: center;"><a-card hoverable style="width: 240px"><template #cover><img :src="state.currentPerson?.img"></template><a-card-meta :title="state.currentPerson?.name"><template #description>抽奖中 角色id:{{ state.currentPerson?.id }} </template></a-card-meta></a-card></div></div><!-- 中奖结束弹框 --><a-modal v-model:open="state.openModal" title="恭喜你中奖" :footer="null" @afterClose="afterCloseModal"><p>中奖用户名称:{{ state.currentPerson?.name }}</p><p>中奖用户id:{{ state.currentPerson?.id }}</p><p><img :src="state.currentPerson?.img"></p></a-modal><!-- 开始游戏按钮 --><div style="position:absolute;bottom:50px;text-align: center;width:100%"><a-button type="primary" @click="startGameBtn" v-if="state.gameStatus === 'init'">开始抽奖</a-button><a-button type="primary" disabled v-if="state.gameStatus === 'run'">进行中</a-button><a-button type="primary" @click="restartGameBtn" v-if="state.gameStatus === 'end'">重新开始</a-button></div></div>
</template>

显示效果:
dispaly-person

⭐交互设计

交互:开始抽奖时 倒计时随机挑选用
思路分解:

  1. 倒计时函数实现
  2. 随机用户取出的实现
  3. 抽奖状态定义: init 初始化 run 运行中 end 结束
    用户数据结构包括
  • id 用户id
  • name 用户名称
  • im 用户头像图片
    具体实现

倒计时实现

// 延时 delay
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))

获取区间数实现 [min,max]

 const max = state.list.length - 1;const min = 0;const randomIndex = Math.floor(Math.random() * (max - min)) + min;

整体js逻辑

<script setup>
import { reactive, onMounted } from 'vue'const state = reactive({list: [],currentPerson: {name: '',img: '',id: ''},gameStatus: 'init',// init 初始化 状态  run 运行 状态 end 结束状态count: 100,displayCount: 0,openModal: false
})// mock 用户数据
const mockUserData = (n) => {let data = []for (let i = 0; i < n; ++i) {data.push({img: `https://source.unsplash.com/random/200x14${i}`,// 随机头像name: '角色' + i,id: i})}state.list = dataconsole.log(state.list)
}// 延时 delay
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))// 开始抽奖
const startGameBtn = async () => {let n = state.countwhile (n--) {state.displayCount = nawait sleep(20)const max = state.list.length - 1;const min = 0;const randomIndex = Math.floor(Math.random() * (max - min)) + min;state.currentPerson = state.list[randomIndex]console.log('randomIndex', randomIndex)console.log('state.currentPerson', state.currentPerson)state.gameStatus = 'run'}state.gameStatus = 'end'state.openModal = true
}const afterCloseModal = () => {state.openModal = false
}// 重新开始抽奖
const restartGameBtn = () => {startGameBtn()
}
onMounted(() => {mockUserData(10)
})
</script>

⭐整体代码

模拟抽奖的整体vue代码块

<template><div><!-- 抽奖用户 列表 --><div v-for="item in state.list" :key="item.id" style="display: inline-block;padding:20px"><div style="display: inline-block;text-align: center;"><div>{{ item.name }}</div><div><a-avatar :size="{ xs: 24, sm: 32, md: 40, lg: 64, xl: 80, xxl: 100 }"><template #icon><img :src="item.img"></template></a-avatar></div></div></div><!-- 抽奖用户 随机旋转的用户--><!-- 0.5s 游戏开始不断轮播用户头像  --><div style="display: flex;justify-content: center;align-items: center;margin-top:50px"v-if="state.gameStatus !== 'init'"><div style="display: inline-block;text-align: center;"><a-card hoverable style="width: 240px"><template #cover><img :src="state.currentPerson?.img"></template><a-card-meta :title="state.currentPerson?.name"><template #description>抽奖中 角色id:{{ state.currentPerson?.id }} </template></a-card-meta></a-card></div></div><!-- 中奖结束弹框 --><a-modal v-model:open="state.openModal" title="恭喜你中奖" :footer="null" @afterClose="afterCloseModal"><p>中奖用户名称:{{ state.currentPerson?.name }}</p><p>中奖用户id:{{ state.currentPerson?.id }}</p><p><img :src="state.currentPerson?.img"></p></a-modal><!-- 开始游戏按钮 --><div style="position:absolute;bottom:50px;text-align: center;width:100%"><a-button type="primary" @click="startGameBtn" v-if="state.gameStatus === 'init'">开始抽奖</a-button><a-button type="primary" disabled v-if="state.gameStatus === 'run'">进行中</a-button><a-button type="primary" @click="restartGameBtn" v-if="state.gameStatus === 'end'">重新开始</a-button></div></div>
</template><script setup>
import { reactive, onMounted } from 'vue'const state = reactive({list: [],currentPerson: {name: '',img: '',id: ''},gameStatus: 'init',// init 初始化 状态  run 运行 状态 end 结束状态count: 100,displayCount: 0,openModal: false
})// mock 用户数据
const mockUserData = (n) => {let data = []for (let i = 0; i < n; ++i) {data.push({img: `https://source.unsplash.com/random/200x14${i}`,// 随机头像name: '角色' + i,id: i})}state.list = dataconsole.log(state.list)
}// 延时 delay
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))// 开始抽奖
const startGameBtn = async () => {let n = state.countwhile (n--) {state.displayCount = nawait sleep(20)const max = state.list.length - 1;const min = 0;const randomIndex = Math.floor(Math.random() * (max - min)) + min;state.currentPerson = state.list[randomIndex]console.log('randomIndex', randomIndex)console.log('state.currentPerson', state.currentPerson)state.gameStatus = 'run'}state.gameStatus = 'end'state.openModal = true
}const afterCloseModal = () => {state.openModal = false
}// 重新开始抽奖
const restartGameBtn = () => {startGameBtn()
}
onMounted(() => {mockUserData(10)
})
</script>

效果:
draw

⭐insicode代码

代码整合在获取质量分的vue3项目中

⭐总结

在实现抽奖之前先模拟过程然后再开始设计思路

模拟过程重要性
模拟过程是指用计算机程序对某一现实系统进行描述和模拟,以预测系统的行为和未来发展趋势。模拟过程在科研、工程设计、产品开发、政策制定等领域中都有重要的应用。

以下是模拟过程的重要性:

  1. 预测系统的行为:通过模拟过程,可以预测系统的行为和未来发展趋势,帮助人们更好地理解系统和作出决策。

  2. 优化系统设计:模拟过程可以帮助设计师更加深入地了解系统的特点和工作原理,发现设计中可能存在的问题,并进行优化和改进。

  3. 节约成本和时间:模拟过程可以代替实际试验,有效节约成本和时间,提高研发效率和成果质量。

  4. 探索未知领域:模拟过程可以在未知领域中进行探索和研究,提高人类对自然和社会现象的认识,推动科学技术进步。

  5. 风险评估和决策支持:通过模拟过程,可以对可能的风险和问题进行评估和预测,帮助决策者制定更加科学合理的决策和政策。

综上所述,模拟过程在众多领域中都具有重要的应用,可以帮助我们更好地认识和理解现实系统,提高工作效率和成果质量,推动社会和科技的进步。

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!
scene

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 感谢你的阅读!

相关文章:

前端 vite+vue3——写一个随机抽奖组件

文章目录 ⭐前言⭐设计布局⭐交互设计⭐整体代码⭐insicode代码 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于前端 vitevue3——写一个抽奖随机组件。 vue3系列相关文章&#xff1a; 前端vue2、vue3去掉url路由“ # ”号——nginx配置 csdn新星计…...

语音芯片基础知识 什么是语音芯 他有什么作用 发展趋势是什么

目录 一、语音芯片的简介 常见的语音芯片有哪些&#xff1f; 语音芯片的种类有很多&#xff0c;大体区分下来也就4个类别而已&#xff1a; 选型的经验说明如下&#xff1a; 推荐使用flash型语音芯片 一、语音芯片的简介 语音芯片基础知识&#xff1a; 什么是语音芯片&…...

设计模式01———简单工厂模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 任务&#xff1a;使用【简单工厂模式】生成四种不同怪物 【按不同路径移动】 首先资源商店下载四个怪物模型 接下来我们选取四个怪物作为预制体并分别起名…...

如何解决MidJourney错过付费后被暂停

问题 假定你已经成功订阅购买了 MidJourney 一段时间&#xff0c;下个月扣费周期到了。 如果你卡里余额不足&#xff0c;卡被封或失效了&#xff0c;或者你想着最近没啥用得上 MidJourney 的地方先省着不续费&#xff0c;等要用的时候就用不了。 如果想要去官网的续费页&…...

考研人考研魂——英语单词篇(20231010)

下一站&#xff0c;上岸 transplanttransportstorestoragestockstridestrikestringstructurestrikingstunprimaryprimeprimitiveprincipalpsychiatryprinciplepsychologyliableliberal transplant n. &#xff08;器官等的&#xff09;移植&#xff1b;移植的器官 vt. 移植&a…...

java 版 项目管理工程系统,实现项目全周期管理-源码交付

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…...

TOGAF(企业架构)

TOGAF 核心概念&#xff08;官方原版&#xff09; 什么是TOGAF&#xff1f; TOGAF?是一种经验证的企业架构方法和框架&#xff0c;被世界领先的组织用于提高业务效率。它是一个企业架构标准&#xff0c;确保企业架构专业人员之间的标准、方法和通信一致&#xff0c;以便我们…...

vue中v-model的原理是什么?v-model作用在组件上的原理是什么?sync修饰符的原理是什么?

vue中v-model的原理是什么&#xff1f; 特点&#xff1a;双向绑定 数据>视图 视图>数据 场景&#xff1a; 收集表单数据组件上 原理&#xff1a; v-model只是个语法题&#xff0c;本质是&#xff1a;v-model v-bind (:value) v-on (input) <template><…...

新闻api接口,新闻资讯,社交媒体,体育赛事,全国热门带正文新闻查询API接口

一、接口介绍 解决同一类新闻在不同平台上的内容获取问题&#xff0c;在归档主流新闻平台的内容数据基础上&#xff0c;对外提供统一的调用方式来完成实时、最新的相关新闻的获取&#xff0c;极大方便各类企业在自有软件中集成新闻内容的功能。支持200余个新闻大站&#xff0c;…...

Redis - php通过ssh方式连接到redis服务器

1.应用场景 主要用于使用php通过ssh方式连接到redis服务器&#xff0c;进行一些操作. 2.学习/操作 1.文档阅读 chatgpt & 其他资料 SSH - 学习与实践探究_ssh应用场景 2.整理输出 2.1 是什么 TBD 2.2 为什么需要「应用场景」 TBD 2.3 什么时候出现「历史发展」 TBD 2.4 …...

IDEA的使用(四)创建不同类型的工程(IntelliJ IDEA 2022.1.3版本)

1. 创建Java工程 创建之后&#xff0c;src下是空的。可以在src下创建软件包Package&#xff0c;命名采用域名倒序。在软件包下再创建Java类。Java类运行后出现中文乱码&#xff0c;就到控制台和文件编码这两个地方设置编码。 2. 创建JavaWeb工程 2.1 在win11和IDEA中配置Tomca…...

Mac上brew切换国内源【极简方案】

前言 下载一些开源包如telnet时&#xff0c;通过brew下载经常由于网络不通&#xff0c;导致下载失败。所以mac用户最好一次性设置brew为国内源。 方案 极简四步&#xff0c;换Homebrew的镜像源为阿里云镜像&#xff0c;依次在终端执行以下几步&#xff1a; 1、cd “$(brew …...

计算机网络面试常问问题--保研及考研复试

前言&#xff1a; Hello大家好&#xff0c;我是Dream。今年保研上岸山东大学人工智能专业 &#xff08;经验贴&#xff09;&#xff0c;现在将我自己的专业课备考知识点整理出来&#xff0c;分享给大家&#xff0c;希望可以帮助到大家&#xff01;这是重点知识总结&#xff0c;…...

elasticsearch 8.5.3问题记录

一&#xff1a;解决 elasticsearch 高版本 warning: ignoring JAVA_HOMEC:\Program Files\Java\jdk-11&#xff1b; using bundled JDK if defined JAVA_HOME (set JAVA_HOME%JAVA_HOME%; )示例版本Elasticsearch 8.5.3 可以与 JDK 11 兼容&#xff0c;但不支持 JDK 17。确保选…...

【Ubuntu虚拟机】

Ubuntu虚拟机配置samba 转载知乎 samba: 安装samba服务 sudo apt-get install samba 2.确定是否确实安装了 samba --version 输入这个命令&#xff0c;确实安装的话&#xff0c;会打印出samba的版本 3.创建一个samba服务的共享目录&#xff0c;并配置该目录为最高权限 sudo …...

江苏服务器有哪些特点

江苏服务器具有以下特点&#xff1a; 高性能&#xff1a;江苏服务器采用高性能的处理器和大内存&#xff0c;能够快速、流畅地处理网络请求和数据&#xff0c;确保网络的高效运行。高防性&#xff1a;江苏服务器通常具有高防性&#xff0c;能够抵御各种DDoS攻击和CC攻击&#…...

acwing算法基础之基础算法--求逆序对的数目

目录 1 知识点2 模板 1 知识点 合并两个有序数组&#xff0c;对于有序数组[l,mid]和有序数组[mid1,r]&#xff0c;将i指向前者&#xff0c;将j指向后者。在将每一个j插入最终有序数组中时&#xff0c;计算 s j m i d − i 1 s_jmid-i1 sj​mid−i1&#xff0c;此为(x,nums[j…...

uni-app 实现考勤打卡功能

一、在页面中引入地图组件 <map id"map" style"width: 100%; height: 100%" :latitude"myLatitude" :longitude"myLongitude" :circles"circles" :markers"markers"> </map>属性名类型说明longitudeN…...

Jenkins发布失败记录

Exception when publishing, exception message [Exec exit status not zero. Status [127]] 见链接&#xff1a;Jenkins发布时常见异常&#xff08;持续更新...&#xff09;_exception when publishing, exception message [exec_码农StayUp的博客-CSDN博客 The remote end hu…...

【算法|双指针系列No.6】leetcode LCR 179. 查找总价格为目标值的两个商品

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…...

python flask接口字段存在性校验函数(http接口字段校验)(返回提示缺少的字段信息)validate_fields()

文章目录 字段存在性校验示例 字段存在性校验 from flask import Flask, request, jsonifyapp Flask(__name__)def validate_fields(data, fields):missing_fields [field for field in fields if field not in data]if missing_fields:return False, f"缺少以下字段: …...

Linux文件-内存映射mmap

mmap定义为&#xff1a;Linux通过将一个虚拟内存区域与一个磁盘上的对象(object)关联起来&#xff0c;以初始化这个虚拟内存区域的内容&#xff0c;这个过程称为内存映射(memory mapping)。 在LINUX中我们可以使用mmap用来在进程虚拟内存地址空间中分配地址空间&#xff0c;创…...

linux 查看当前正在运行的端口和监听的端口的工具及命令

在Linux系统中&#xff0c;你可以使用多种工具和命令来查看当前正在运行的端口和监听的端口。以下是一些常用的工具和命令&#xff1a; netstat命令&#xff1a; Netstat&#xff08;Network Statistics&#xff09;是一个用于查看网络连接、路由表和接口统计信息的命令行工具…...

保护互联网数据安全:关键方法与最佳实践

在当今数字化时代&#xff0c;互联网数据安全已经成为个人、企业和组织的首要任务之一。随着信息技术的迅猛发展&#xff0c;网络威胁也不断演进&#xff0c;因此保护互联网数据安全变得尤为关键。本文将介绍一些关键方法和最佳实践&#xff0c;帮助您确保互联网数据的安全性。…...

分布式数据库HBase(林子雨慕课课程)

文章目录 4. 分布式数据库HBase4.1 HBase简介4.2 HBase数据模型4.3 HBase的实现原理4.4 HBase运行机制4.5 HBase的应用方案4.6 HBase安装和编程实战 4. 分布式数据库HBase 4.1 HBase简介 HBase是BigTable的开源实现 对于网页搜索主要分为两个阶段 1.建立整个网页索引&#xf…...

矩阵求导的本质与分子布局、分母布局的本质

大佬讲解的实在太吊了。 就拿大佬的总结说明一下&#xff1a; 矩阵求导结果&#xff0c;无非就是分子的转置、向量化&#xff0c;分母的转置、向量化&#xff0c;它们的各种组合而已。 1、分子布局的本质&#xff1a;分子是标量、列向量、矩阵向量化后的列向量&#xff1b;分母…...

【广州华锐互动】VR建筑施工事故体验:提高工人安全意识和责任感

VR建筑施工事故体验的意义在于通过模拟真实场景和情况&#xff0c;帮助人们更好地理解建筑施工中的安全问题&#xff0c;并提供一种安全、有效的方式来学习和掌握安全技能。 建筑施工是一项高风险的工作&#xff0c;涉及各种复杂的工作环境和操作过程。在现实中&#xff0c;建筑…...

HSRP热备份路由器协议的解析和配置

HSRP的解析 个人简介 HSRP hot standby router protocol 热备份路由协议&#xff08;思科私有协议&#xff09; HSRP v1 version 1 HSRP v2 version 2 虚拟一个HSRP虚拟IP地址 192.168.1.1 开启HSRP的抢占功能 通过其他参数 人为调整谁是主 谁是从 &#xff01; 查…...

kotlin实现ArrayDeque

Deque双端队列&#xff0c;一直在使用&#xff0c;却从未了解过源码。 内部逻辑其实很简单 可扩容数组循环队列&#xff0c;循环栈扩容倍数1.5&#xff0c;sizesize(size shr 1)只从两端存取元素 fun main() {val deque MyArrayDeque()repeat(16) {deque.addLast(it)}while …...

java时间格式化

1&#xff0c;CST时间格式化&#xff0c;这个一般是返回值的类型为 Date 类型&#xff0c;如果不做处理&#xff0c;返给前端的就是时间戳&#xff0c;当然也可以更改返回值类型为 String&#xff0c;这样就不用处理了。方法如下&#xff1a; /*** 格式化时间* param date Thu…...