ToB企服应用市场:ToB评测及商务社交产业平台

标题: uniapp小步伐抽奖怎么做?直接使用【almost-lottery转盘组件】或者【自定义 [打印本页]

作者: 盛世宏图    时间: 2024-12-21 06:38
标题: uniapp小步伐抽奖怎么做?直接使用【almost-lottery转盘组件】或者【自定义
直接使用almost-lottery

地址:GitHub - ialmost/almost-components_uniapp: uni-app 使用的多端组件聚集,支持APP、H5、小步伐uni-app 使用的多端组件聚集,支持APP、H5、小步伐. Contribute to ialmost/almost-components_uniapp development by creating an account on GitHub.
https://github.com/ialmost/almost-components_uniapp

Almost-Lottery 是一个基于 uni-app 框架开辟的抽奖转盘组件,实用于多种平台(如微信小步伐、付出宝小步伐、H5、App 等)。它通过 Canvas 绘制转盘,支持丰富的自定义配置,能够满足各种抽奖场景的需求。以下是对 Almost-Lottery 组件的详细先容:

1. 功能概述

Almost-Lottery 提供了以下焦点功能:


2. 紧张特性



3. 使用方法

3.1 安装与导入


  1. <template>
  2.   <almost-lottery
  3.     :prizeList="prizeList"
  4.     :prizeIndex="prizeIndex"
  5.     @draw-before="handleDrawBefore"
  6.     @draw-start="handleDrawStart"
  7.     @draw-end="handleDrawEnd"
  8.   />
  9. </template>
  10. <script>
  11. import AlmostLottery from '@/uni_modules/almost-lottery/components/almost-lottery/almost-lottery.vue';
  12. export default {
  13.   components: { AlmostLottery },
  14.   data() {
  15.     return {
  16.       prizeList: [], // 奖品列表
  17.       prizeIndex: -1, // 中奖下标
  18.     };
  19.   },
  20.   methods: {
  21.     handleDrawBefore(callback) {
  22.       // 自定义抽奖前的逻辑
  23.       callback(true); // 返回 true 表示允许抽奖
  24.     },
  25.     handleDrawStart() {
  26.       // 抽奖开始时的逻辑
  27.     },
  28.     handleDrawEnd() {
  29.       // 抽奖结束后的逻辑
  30.     },
  31.   },
  32. };
  33. </script>
复制代码
3.2 配置项


3.3 事件钩子



4. 示例项目

Almost-Lottery 提供了丰富的示例项目,开辟者可以参考以下功能:


5. 平台兼容性


自定义宫格转盘

思路:设计页面,状态控制
排布奖品和按钮为宫格布局
  1. <template>
  2. <view class="container">
  3.   <view class="my-lottery row-between wrap" v-if="status">
  4.     <view v-for="(item, index) in lotteryData" :key="index" :class="(item.type == 999 ? 'lotty-btn' : 'lottery-item') + ' column-center ' + (activeIndex == index ? 'active' : '')" style="width: 180rpx;height: 180rpx;" @tap="onLotteryClick(item.type)">
  5.       <image :src="item.image" style="width: 80rpx;height: 80rpx; border-radius: 8rpx;"></image>
  6.       <text :class="item.type == 999 ? 'xs mt20' : 'nr mt10'"
  7.           :style="'color: ' + (item.type == 999 ? '#ED3720' : '#743C3C') + ';font-weight: 600;text-align: center;padding: 0 24rpx;'">{{item.name}}</text>
  8.     </view>
  9.   </view>
  10.   <view class="activity-null row-center" v-else>
  11.     活动暂未开始
  12.   </view>
  13. </view>
  14. </template>
复制代码
开始抽奖,设置高亮宫格开始,计时器中控制下一个,根据轮训的索引值,在开始抽奖接口返回了中奖的索引之后,设置最后一步到位的状态。当然也必要在其中控制速率达到先快,后慢的体验优化。
  1.     startLotteryFun() {
  2.       let {
  3.         currentIndex
  4.       } = this;
  5.       let activeIndex = this.getHighLightItemIndexFun(currentIndex);
  6.         this.activeIndex = activeIndex
  7.         const currentOrder = currentIndex % 8;
  8.         this.currentIndex = ++currentIndex;
  9.                 console.log(77777123, currentIndex, this.circleTimes, this.luckyOrder, currentOrder)
  10.         if (currentIndex > this.circleTimes + 8 && this.luckyOrder == currentOrder) {
  11.           if (this.lotteryTimer) {
  12.             clearTimeout(this.lotteryTimer);
  13.           }
  14.         
  15.           setTimeout(() => {
  16.             this.stopCallbackFun(LOTTERY_ORDER[this.luckyOrder]);
  17.             setTimeout(() => {
  18.               // this.reset();
  19.               this.activeIndex = -1
  20.             }, 1000);
  21.           }, 500);
  22.         } else {
  23.           if (currentIndex < this.circleTimes) {
  24.             this.speed -= 10
  25.           } else if (currentIndex > this.circleTimes + 8 && this.luckyOrder == currentOrder + 1) {
  26.             this.speed += 80
  27.           } else {
  28.             this.speed += 20
  29.           }
  30.         
  31.           if (this.speed < 50) {
  32.             this.speed = 50
  33.           }
  34.         
  35.           this.lotteryTimer = setTimeout(this.startLotteryFun.bind(this), this.speed);
  36.         }
  37.     },
  38.     // luckyIndex: 中奖在列表中的index
  39.     stopCallbackFun(luckyIndex) {
  40.                 this.reset()
  41.       this.$emit("finish", {
  42.         detail: this.result
  43.       });
  44.     },
  45.     // 根据 currentIndex 获取当前应该高亮列表中的第几个奖品
  46.     getHighLightItemIndexFun(currentIndex) {
  47.       return LOTTERY_ORDER[currentIndex % LOTTERY_ORDER.length];
  48.     },
  49.     // 根据奖品在数据中的index,获取奖品在转盘中的位置
  50.     getLuckyItemOrderFun(index) {},
  51.     start(e) {
  52.                 console.log(887777, e, this.isLottery)
  53.       // 如果还没开始转动,开始转动转盘
  54.       if (!this.isLottery) {
  55.         this.isLottery = true
  56.         this.userLotteryFun();
  57.       }
  58.     },
  59.     // 停止转动
  60.     stop(index, callback) {
  61.       this.luckyOrder = this.getLuckyItemOrderFun(index);
  62.       console.log("stop, ###", index);
  63.       this._stopCallback = callback;
  64.     },
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4