微信小程序开发案例 | 幸运转盘抽奖小程序(下)

举报
TiAmoZhang 发表于 2025/11/15 10:22:36 2025/11/15
【摘要】 阶段案例-幸运转盘抽奖小程序

阶段案例-幸运转盘抽奖小程序

01、逻辑实现

1 首页逻辑

首页主要功能就是监听用户点击按钮动作,然后随机抽奖后进行大转盘旋转动画5秒,最后传递中奖信息给结果页去显示。

1)点击“Start”按钮开始抽奖

首先要为转盘添加动画属性、并为按钮追加点击事件,index.wxml代码修改如下:

1. <!-- 1 整体容器 -->
2. <view class="container">
3. <!-- 2 转盘区域 -->
4. <view class="turntableBox">
5. <!-- 2-1 转盘 -->
6. <image class="turntable" src="/images/turntable/turntable.png" animation="{{ani}}"></image>
7. <!-- 2-2 指针 -->
8. <image class="arrow" src="/images/turntable/go.png"></image>
9. </view>
10.
11. <!-- 3 按钮 -->
12. <button bindtap="startGame">Start</button>
13. </view>
在index.js中新增startGame()函数,相关代码如下:
1. // index.js
2. Page({
3. …,
4. /**
5. * 自定义函数--开始抽奖
6. */
7. startGame: function () {
8. // 随机生成抽奖结果(0-7之间的整数)
9. let x = Math.floor(Math.random() * 8)
10.
11. // 创建动画对象01
12. let ani01 = wx.createAnimation({
13. timingFunction: 'ease',//先慢,中间快,最后又慢回去
14. duration: 5000, //持续时间5秒(1000ms=1s)
15. })
16. // 描述动画01:先转5圈再转到正确的角度
17. ani01.rotate(360 * 5 + 45 * x).step()
18. // 导出动画01至转盘组件的动画属性
19. this.setData({ ani: ani01.export() })
20.
21. // 定时器5秒后跳转结果页
22. setTimeout(() => {
23. wx.navigateTo({
24. url: '../result/result?x=' + x,
25. })
26. }, 5000)
27. },
28. …29. }
此时就已经可以看到抽奖时转盘旋转动画并跳转结果页了,只不过当前结果页的数据都是之前固定写的假数据不会发生变化。效果如下图所示。

■ 图11-24  抽奖过程功能实现


实际上还存在一个问题,按钮如果一直被用户点击会导致重复触发大转盘旋转动作和重复多次抽奖。下一节将介绍如何通过禁止按钮重复点击来解决此问题。

2)禁止按钮重复点击

为了防止按钮被多次点击导致错误,给其追加disable属性,index.wxml代码修改如下:

1. <!-- 1 整体容器 -->
2. <view class="container">
3. …
4. <!-- 3 按钮 -->
5. <button disabled="{{isDisabled}}" bindtap="startGame">Start</button>
6. </view>
在index.js的data属性中使其初始值为false,表示不禁用按钮,相关代码如下:
1. // index.js
2. Page({
3. …,
4. /**
5. * 页面的初始数据
6. */
7. data: {
8. isDisabled: false //是否禁用按钮
9. },
10. …11. }
然后修改index.js中的startGame()函数,当触发抽奖事件时禁用按钮。

index.js相关代码修改如下:

1. // index.js
2. Page({
3. …,
4. /**
5. * 自定义函数--开始抽奖
6. */
7. startGame: function () {
8. // 禁止按钮重复点击
9. this.setData({
10. isDisabled: true
11. })
12.
13. },
14. …15. }
注:加粗部分加到startGame()函数内最前面,原先函数内的代码都保留不变。

这样就不怕用户重复多次点击按钮了,效果如下图所示。

■ 图11-25  禁止按钮重复点击功能实现


3)还原初始状态

当用户在结果页点击“重新开始”按钮时,需要回到首页进行第二轮抽奖。此时如果按钮还是保持禁用状态、转盘还是保持上一次的抽奖结果就不太合适了。

因此需要找到index.js文件的onShow()函数,将按钮和转盘都还原。

index.js的onShow()函数代码修改如下:

1. // index.js
2. Page({
3. …,
4. /**
5. * 生命周期函数--监听页面显示
6. */
7. onShow: function () {
8. // 重新允许按钮点击
9. this.setData({
10. isDisabled: false
11. })
12. // 创建动画对象02
13. let ani02 = wx.createAnimation({
14. duration: 5,
15. timingFunction: 'linear',
16. })
17. // 描述动画02:旋转0°=让转盘恢复初始位置
18. ani02.rotate(0).step()
19. // 导出动画02至转盘组件的动画属性
20. this.setData({
21. ani: ani02.export()
22. })
23. },
24. …25. })
注:从结果页返回首页时只会触发onShow()不会触发onLoad(),因为首页并没有被关闭,是新打开的结果页使首页隐藏了而已,返回时首页重新显示出来。

此时首页逻辑就全部完成了。

2 结果页逻辑

1)设置抽奖奖项数据

在utils的data.js文件中新增奖项数据,并提供给结果页result.js使用。

utils/data.js代码如下:

1. // 中奖数据
2. const rewards = [
3. {
4. text:'15积分',
5. filename:'15jifen.png'
6. },
7. {
8. text:'25积分',
9. filename:'25jifen.png'
10. },
11. {
12. text:'谢谢参与',
13. filename:'xiexie.png'
14. },
15. {
16. text:'25钻石',
17. filename:'25zuan.png'
18. },
19. {
20. text:'20元代金券',
21. filename:'20yuan.png'
22. },
23. {
24. text:'15积分',
25. filename:'15jifen.png'
26. },
27. {
28. text:'100元代金券',
29. filename:'100yuan.png'
30. },
31. {
32. text:'10钻石',
33. filename:'10zuan.png'
34. }
35. ]
36.
37. // 导出公共数据
38. module.exports = {
39. rewards:rewards40. }
声明了一个rewards数组,共有8个元素,每个元素包含2个属性解释如下:

● text:中奖奖项的文字描述;

● filename:中奖奖项的图片文件名。

然后在结果页result.js顶部引用:

1.  // pages/result/result.js
2.  // 导入公共数据
3.  const { rewards } = require('../../utils/data')4.  …
这样结果页就可以直接用变量名称rewards来使用它了。

2)  显示指定的中奖结果

修改result.wxml代码,将需要显示的中奖图片和文字改为变量方便更新。

result.wxml相关代码修改如下:

1. <!-- 1 整体容器 -->
2. <view class="container">
3. <!-- 2 中奖图片 -->
4. <image src="/images/rewards/{{reward.filename}}" mode="widthFix"></image>
5. <!-- 3 中奖文字 -->
6. <text>{{reward.text}}</text>
7. …
8. </view>
因为这里全部图片都是.png格式后缀名,所以只需要将图片名称改为变量即可。

在result.js的data属性中先给予初始值,相关代码如下:

1. // result.js
2. Page({
3. /**
4. * 页面的初始数据
5. */
6. data: {
7. reward:{
8. filename:'xiexie.png',
9. text:'谢谢参与'
10. }
11. },
12. …13. }

这样就和之前设计完成的效果保持一致了。

在result.js的生命周期函数onLoad(options)中接收首页传递过来的参数x。

result.js相关代码更新如下:

1. // result.js
2.
3. Page({
4. …,
5. /**
6. * 生命周期函数--监听页面加载
7. */
8. onLoad: function (options) {
9. // 获取参数x
10. let x = options.x
11. // 中奖结果更新到页面上
12. this.setData({
13. reward: rewards[x]
14. })
15. },
16. …17. }
此时已经可以和首页连贯起来测试抽奖功能了。

开发者如果不方便来回切换可以顶部“普通编译”处新增结果页的编译模式。参数配置可参考图11-26。

■ 图11-26  结果页编译模式配置参数示例


注:这里的x取值可以是[0,7]之间任意整数。

最终效果如图11-27所示。

■ 图11-27  结果页显示指定中奖结果


3)返回首页

修改result.wxml代码,为按键追加自定义点击事件backToHome。

result.wxml相关代码修改如下:

1. <!-- 1 整体容器 -->
2. <view class="container">
3. <!-- 2 中奖图片(…内容略…) -->
4. <!-- 3 中奖文字(…内容略…) -->
5.
6. <!-- 4 返回按钮 -->
7. <button bindtap="backToHome">重新抽奖</button>
8. </view>
在result.js中追加自定义函数backToHome,相关代码如下:
1. // result.js
2. Page({
3. …,
4. /**
5. * 自定义函数--返回首页
6. */
7. backToHome: function () {
8. wx.navigateBack()
9. },
10. …11. }
至此整个阶段案例就完成了,完整运行效果如图11-28所示。

■ 图11-28  第11章阶段案例最终效果图

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。