微信小程序走马灯式抽奖
LvyYoung 人气:1先来看下效果
设置奖项
awardList是从后台拿到的奖项数组,list不够八位时填充谢谢参与奖项,超过八位时截取数组,然后随机打乱数组,保证奖项随机布局,第四位固定填充立即抽奖按钮
// 设置奖项 settingAward(awardList) { const len = awardList.length; const award = { awardName: '谢谢参与', awardMoney: 0, awardType: '00', awardCode: '' }; let _awardList = []; if (len < 8) { for (let i = 0; i < 8 - len; i++) { awardList.push(JSON.parse(JSON.stringify(award))); } this.randArr(awardList); _awardList = awardList; console.log(_awardList) } else if (awardList.length == 8) _awardList = awardList; else { _awardList = awardList.splice(0, 9); } _awardList.splice(4, 0, { awardName: '立即抽奖' }) return _awardList; }, // 随机打乱奖项 randArr(arr) { for (var i = 0; i < arr.length; i++) { var iRand = parseInt(arr.length * Math.random()); var temp = arr[i]; arr[i] = arr[iRand]; arr[iRand] = temp; } return arr; }
布局
主要用了flex布局,遍历奖品list,index==4时渲染立即抽奖按钮,否则渲染奖项
<view class="content"> <view wx:for="{{awardList}}"> <view wx:if="{{index == 4}}" class="award"> <view wx:if="{{activityCount > 0}}" class="btn {{lucking ? 'lucking' : 'lucked'}}"> <text class="btn_text" catchtap="startLuck">{{item.awardName}}</text> </view> <view wx:else class="btn lucking"> <text class="btn_text">{{item.awardName}}</text> </view> </view> <view wx:else class="award {{currentIndex == index ? 'selected' : 'unselected'}}"> <block wx:if="{{item.awardType == '00'}}"> <view class="option"> <image src="../../img/noluck_icon.png"></image> </view> <view class="txt">{{item.awardName}}</view> </block> <block wx:elif="{{item.awardType == '07'}}"> <view class="option"> <image src="../../img/mianxi_icon.png"></image> </view> <view class="txt">{{item.awardName}}</view> </block> <block wx:else> <view class="option"> <image src="../../img/turntable_redpacket.png"></image> <text class="price">{{util.formatMoney(item.awardMoney)}}</text> </view> <view class="txt">{{item.awardName}}</view> </block> </view> </view> </view>
抽奖逻辑
开始抽奖时默认选中第一个,初始化idArr为currentIndex的索引,即下一个奖项在哪激活
记录圈数let cycles = 0;
开始设置interval = setInterval(frame, 100);
index == 8
时轮询了一圈,cycles加一
当cycles > 2时减速定时器interval = setInterval(frame, 300);
当抽奖接口有结果且转了三圈后跳到获奖位置,清除定时器并弹出获奖结果弹窗
// 开始抽奖 startLuck() { const idArr = [0, 1, 2, 5, 8, 7, 6, 3]; let cycles = 0; let that = this; let _awardList = this.data.awardList; let index = this.data.currentIndex; let activityCount = this.data.activityCount - 1; var interval = setInterval(frame, 100); this.setData({ lucking: true, activityCount }) let pending = true; post('122201.app', { duration: 2000, activityCode: this.data.activityCode }, { isMarket: true }).then(res => { pending = false; this.setData({ awardResult: { awardCode: "", ...res } }) }).catch(err => { clearInterval(interval); pending = false; activityCount += 1; this.setData({ activityCount, lucking: false, }) }) function frame() { if (!pending) { // 转三圈后跳到获奖位置 if (cycles > 3) { if (_awardList[that.data.currentIndex].awardCode == that.data.awardResult.awardCode) { clearInterval(interval); that.setData({ lucking: false, showModal: true }) return; } } } if (index == 8) { index = 0; if (!pending) { // 两圈后转盘减速 if (cycles++ > 1) { clearInterval(interval); interval = setInterval(frame, 300); } } } // 设置奖项跳到对应位置 that.setData({ currentIndex: idArr[index++] }) } },
wxss
.turntable .content { width: 568rpx; height: 568rpx; background: #F48002; border-radius: 20px; position: absolute; top: 90rpx; left: 30rpx; display: flex; flex-wrap: wrap; justify-content: space-around; align-items: center; padding: 10rpx; box-sizing: border-box; } .turntable .content .award { width: 174rpx; height: 174rpx; background: #FFFFFF; border-radius: 20rpx; display: flex; flex-direction: column; justify-content: center; align-items: center; }
加载全部内容