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

这篇具有很好参考价值的文章主要介绍了前端 vite+vue3——写一个随机抽奖组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前端 vite+vue3——写一个随机抽奖组件,web站点,前端,anti-design-vue,vue3,setup,javascript,原力计划

⭐前言

大家好,我是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社区中的重要组成部分。
抽奖效果
前端 vite+vue3——写一个随机抽奖组件,web站点,前端,anti-design-vue,vue3,setup,javascript,原力计划

⭐设计布局

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

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

<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>

显示效果:
前端 vite+vue3——写一个随机抽奖组件,web站点,前端,anti-design-vue,vue3,setup,javascript,原力计划

⭐交互设计

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

  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 = data
    console.log(state.list)
}

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

// 开始抽奖
const startGameBtn = async () => {

    let n = state.count
    while (n--) {
        state.displayCount = n
        await 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 = data
    console.log(state.list)
}

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

// 开始抽奖
const startGameBtn = async () => {

    let n = state.count
    while (n--) {
        state.displayCount = n
        await 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>

效果:
前端 vite+vue3——写一个随机抽奖组件,web站点,前端,anti-design-vue,vue3,setup,javascript,原力计划

⭐insicode代码

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

⭐总结

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

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

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

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

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

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

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

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

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

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!
前端 vite+vue3——写一个随机抽奖组件,web站点,前端,anti-design-vue,vue3,setup,javascript,原力计划

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 感谢你的阅读!文章来源地址https://www.toymoban.com/news/detail-713884.html

到了这里,关于前端 vite+vue3——写一个随机抽奖组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3+Vite前端知识汇总1篇

       目录 1、设置package.json,让编译完成后自动打开浏览器。 2、设置vite.config.ts,设置src别名,后面就不用 ../../../ 了。 3、安装@types/node  解决vscode显示红波浪线问题。  4、安装 sass和reset.css 5、创建并引入全局组件,HospitalTop 6、安装路由,并添加切换路由后滚动到顶部功能

    2024年02月16日
    浏览(45)
  • 前端VUE3+Vite +UniAPP-- 框架搭建

    除了HBuilderX可视化界面,也可以使用 cli 脚手架,可以通过 vue-cli 创建 uni-app 项目。 全局安装 vue-cli 官网 配置tailwindcss插件 官网 在 tailwind.config.js 配置文件中添加所有模板文件的路径。 将加载 Tailwind 的指令添加到你的 CSS 文件中 在你的主 CSS 文件中通过 @tailwind 指令添加每一

    2024年02月11日
    浏览(45)
  • Vue3+vite实现组件上传npm并应用

    场景 :就是A项目的组件需要在B项目中使用 下面举例的是把a项目pagination分页组件上传到npm,在b项目使用 采坑日记 :封装的组件一定要起name要不调用不成功 1.1 首先在公用组件components文件夹下创建index.js文件,  1.2 index.js  1.3 vite.config.js  1.4 package.json  执行npm run build打包

    2024年02月16日
    浏览(43)
  • vue3+ts+vite项目引入echarts,vue3项目echarts组件封装

    技术栈 :Vue3 + Ts + Vite + Echarts 简介 : 图文详解,教你如何在 Vue3 项目中 引入Echarts , 封装Echarts组件 ,并实现常用Echarts图例 1.1 静态效果 1.2 动态效果 2.1 安装 Echarts npm: pnpm: 2.2 main.ts 中引入 2.3 Echarts 组件封装 /src/components/ReEcharts/index.vue 文件中写入如下代码 3.1 柱状图 实现

    2024年02月09日
    浏览(64)
  • 从0搭建Vue3组件库(五): 如何使用Vite打包组件库

    本篇文章将介绍如何使用 vite 打包我们的组件库,同时告诉大家如何使用插件让打包后的文件自动生成声明文件(*.d.ts) 打包配置 vite 专门提供了库模式的打包方式,配置其实非常简单,首先全局安装 vite 以及@vitejs/plugin-vue pnpm add vite @vitejs/plugin-vue -D -w 在 components 文件下新建vite.

    2024年01月24日
    浏览(53)
  • Vite + Vue3 实现前端项目工程化

    Vue3 发布至今,周边的生态、技术方案已足够成熟,个人认为新项目是时候切换到 Vite + Vue3 了。今天就给大家操作一下这种技术方案实现前端工程化。 数字化管理平台 Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus Vue权限系统案例 个人博客 通过官方脚手架初始化项目 第一种方式,这是使

    2024年02月03日
    浏览(74)
  • 创建一个vite+vue3项目详细教程

    一、首先打开本地磁盘,找到一个存放路径  这里 我选择将新建项目放置在E盘的demo-vitedemo路径下 二、在该路径处打开命令行cmd  三、在打开的命令行中输入创建命令  注意在搭建之前要安装node.js环境依赖,并且确认你的版本 Vite 需要Node.js版本 14.18+,16+。然而,有些模板需

    2024年02月15日
    浏览(55)
  • Vue3 前端生成随机id( 生成 UUID )

    重新创建一个文件**/utils/someTools.js**,并在里面写入如下代码。 随机打开一个你想要生成id的文件,先 引入 文件,然后调用**guid()**方法。

    2024年04月15日
    浏览(50)
  • 07. vue3+vite+qiankun搭建微应用前端框架,并接入vue3微应用

    因为业务系统接入的需要,决定将一个vue3+vite+ts的主应用系统,改造成基于qiankun的微应用架构。此文记录了改造的过程及vue3微应用接入的种种问题。 网上有很多关于微应用改造的案例,但很多都没写部署之后什么情况。写了部署的,没有实操部署在二级目录、三级目录是什

    2024年01月16日
    浏览(65)
  • Vue3+TS+Vite开发组件库并发布到npm

    Vue2开发插件并发布到npm 使用VitePress静态网站生成器创建组件库文档网站并部署到GitHub 目标:创建 vue-amazing-ui 组件库 ,并发布到npm 该组件库已发布到 npm,直接安装即可使用: Vue Amazing UI 在线预览 目前拥有的 Components 组件: Component name Descriptions Component name Descriptions Alert 警

    2024年02月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包