怒砸 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]; //否则减去当前的概率范围,进入下一轮循环
    }
  }
}
复制代码

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


目录
相关文章
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
142 64
|
2月前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
114 60
|
10天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
38 3
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
39 8
|
2月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
32 1
|
2月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
42 1
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
2月前
|
存储 JavaScript 前端开发
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
【10月更文挑战第21天】 vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
|
2月前
|
JavaScript 索引
Vue 3.x 版本中双向数据绑定的底层实现有哪些变化
从Vue 2.x的`Object.defineProperty`到Vue 3.x的`Proxy`,实现了更高效的数据劫持与响应式处理。`Proxy`不仅能够代理整个对象,动态响应属性的增删,还优化了嵌套对象的处理和依赖追踪,减少了不必要的视图更新,提升了性能。同时,Vue 3.x对数组的响应式处理也更加灵活,简化了开发流程。
|
2月前
|
JavaScript 前端开发 开发者
Vue 3中的Proxy
【10月更文挑战第23天】Vue 3中的`Proxy`为响应式系统带来了更强大、更灵活的功能,解决了Vue 2中响应式系统的一些局限性,同时在性能方面也有一定的提升,为开发者提供了更好的开发体验和性能保障。
80 7

热门文章

最新文章