怒砸 30w+ 矿石抽礼盒后,我通透了...【 幸运大转盘Vue3版】

简介: 前言大家好,我是HoMeTown。中秋节快到了,掘金社区一如既往十分贴心的在这种有意义节日里推出了社区周边的礼盒,像之前的端午粽子礼盒,这次推出了中秋月饼礼盒。

前言

大家好,我是HoMeTown。

中秋节快到了,掘金社区一如既往十分贴心的在这种有意义节日里推出了社区周边的礼盒,像之前的端午粽子礼盒,这次推出了中秋月饼礼盒。

不翼而飞的矿石

满打满算,从今年的端午礼盒到现在的中秋礼盒,我最起码攒了有30w+的矿石了(海底+签到+Bug+升级奖励),但是当我打开我的余额,他却瘪成这样:

网络异常,图片无法展示
|

矿石去哪儿了?

网络异常,图片无法展示
|

矿石在这:

网络异常,图片无法展示
|

掘金一直保持初心,逢年过节推出节日性礼盒。

我也是,逢年过节疯狂的点击抽奖按钮,然而 一如既往的梭哈,一如既往的打水漂。

你不是欺负老实人吗? --《让子弹飞》

在沸点看到有人抽中了,然后咱也不知道从哪儿来的自信,就觉得自己说不定也能中,想靠运气试试能不能搞一个,紧接着脑袋一热,小手一点。辛辛苦苦攒的钻石全部拜拜👋🏻。

有人说这叫赌徒心理。

借此机会,我也去搜了一下什么叫赌徒心理,同时分享给大家:

(1)只想碰运气发横财,不愿意劳动致富、创业致富;

(2)敢于孤注一掷,铤而走险,甚至不惜以生命为代价;

(3)为了达到目的,可以不择手段。

但是我感觉我这应该算不上赌徒心理?撑死应该沾点边儿吧(ps. 其实差不多)。

no pay can play

本着不想花矿石,还想玩儿的目的,我决定用Vue3自己做一个和它一样的抽奖转盘。

公平!公平!还是TMD公平! --《让子弹飞》

撸起袖子加油干

首先是排版与样式,这块没什么好说的,简单先划分一下结构:

网络异常,图片无法展示
|

定义结构:

  • lottery-container 转盘容器
  • turntable-wrap 抽奖盒子
  • border 4条边框
  • goods-container 商品容器
  • cost-wrap 操作盒子
  • btn1 单抽
  • btn2 十连抽
  • result-container 抽奖结果容器
  • mask 遮罩层
  • model 模态层

关键点在于实现的js逻辑,首先,类似这样的js逻辑,本应该放在服务端,而不应该在客户端进行处理,此处只是demo,有不对的地方望指正:

点击开始抽奖的事件:

function onStart() {
    // 设置定时器,每隔20ms做一次update操作,以达到动态切换active的目的
    let interval = setInterval(() => {
            // 此处没有用函数 winPrize是因为20ms的频率开销太大,所以仅做mock,在最后的时候更新即可
            curActive.value = Math.floor(Math.random() * 9)
    }, 20)
    // 设置延时器,结束定时操作
    let timer = setTimeout(() => {
            // 拿到最后中奖的索引
            curActive.value = winPrize(probArr.value)
            // 弹出结果层、清楚定时器 & 延时器
            showResult.value = true
            clearInterval(interval)
            clearTimeout(timer)
    }, 2000);
}
复制代码

中奖结果的概率计算,这里相对上面的逻辑来说可能比较复杂一点,但是我的这个也是比较简单版本的,我的思路是分为以下几步:

  • 获取总概率区间
  • 获取 0-总概率区间的一个随随机整数
  • 如果在当前的概率范围内,得到的就是当前概率
  • 否则减去当前的概率范围,进入下一轮循环
const goods = [
    { probability: 10, name: '随机矿石', }, 
    { probability: 10, name: '随机矿石', }, 
    { probability: 10, name: '随机矿石', }, 
    { probability: 10, name: '随机矿石', }, 
    { probability: 10, name: '随机矿石', }, 
    { probability: 50, name: 'Switch', }, 
]
// 对应各个奖项的概率,总和为100
const probArr = computed(() => {
    return goods.map(item => item.probability)
})
复制代码
function winPrize(arr) {
  let sum = eval(arr.join("+")); // 获取总概率区间
  for (let i = 0; i < arr.length; i++) {
    let random = parseInt(Math.random() * sum); // 获取 0-总概率区间的一个随随机整数
    if (random < arr[i]) {
      return i; //如果在当前的概率范围内,得到的就是当前概率
    } else {
      sum -= arr[i]; //否则减去当前的概率范围,进入下一轮循环
    }
  }
}
复制代码

十连抽的逻辑也是相同的,只是将最后的结果从单个下标换成下标的集合。


目录
相关文章
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
1372 139
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
1614 5
|
12月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
737 1
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
1283 11
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
818 0
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
1282 1
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
1376 17
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
677 0
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
394 0
|
JavaScript 前端开发 算法
Vue 3 和 Vue 2 的区别及优点
Vue 3 和 Vue 2 的区别及优点
1009 12