微信小程序之九宫格抽奖

1.实现效果

2. 实现步骤

话不多说,直接上代码

javascript 复制代码
/**index.wxml*/
<view class="table-list flex fcc fwrap">
    <block wx:for="{{tableList}}" wx:key="id">
        <view class="table-item btn fcc {{isTurnOver?'':'grayscale'}}" wx:if="{{item.type=='btn'}}" bind:tap="onPrizeClick">{{item.name}}</view>
        <view class="table-item fcc {{item.isSelected?'selected':''}}" wx:else>{{item.name}}</view>
    </block>
</view>
javascript 复制代码
import { showTextToast } from '../../utils/util';

// pages/turnTable/index.js
Page({
  /**
   * 页面的初始数据
   */
  data: {
    tableList: [
      { id: '1', type: 'prize', name: '奖品1', isSelected: false },
      { id: '2', type: 'prize', name: '奖品2', isSelected: false },
      { id: '3', type: 'prize', name: '奖品3', isSelected: false },
      { id: '4', type: 'prize', name: '奖品8', isSelected: false },
      { id: '5', type: 'btn', name: '抽奖', isSelected: false },
      { id: '6', type: 'prize', name: '奖品4', isSelected: false },
      { id: '7', type: 'prize', name: '奖品7', isSelected: false },
      { id: '8', type: 'prize', name: '奖品6', isSelected: false },
      { id: '9', type: 'prize', name: '奖品5', isSelected: false },
    ],
    isTurnOver: true, //抽奖状态,是否旋转完(九宫格)
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {},

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {},

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {},

  /****************************************** 九宫格抽奖 *******************************/

  onPrizeClick() {
    //如果不在抽奖状态中,则执行抽奖旋转动画
    if (this.data.isTurnOver) {
      this.setData({
        isTurnOver: false,
      });
      // 随机奖品效果
      const rand = (m, n) => {
        return Math.ceil(Math.random() * (n - m + 1) + m - 1);
      };
      let prizeId = rand(1, 8);

      this.lottery(prizeId);
    } else {
      showTextToast('请勿重复点击');
    }
  },

  // 抽奖旋转动画方法
  lottery(prize_id) {
    console.log('中奖ID:' + prize_id);
    /*
     * 数组的长度就是最多所转的圈数,最后一圈会转到中奖后的位置
     * 数组里面的数字表示从一个奖品跳到另一个奖品所需要的时间
     * 数字越小速度越快
     * 想要修改圈数和速度的,更改数组个数和大小即可
     */
    // let num_interval_arr = [90, 80, 70, 60, 50, 50, 50, 100, 150, 250];
    let num_interval_arr = [90, 80, 70, 60, 50, 50, 250];
    // 旋转的总次数
    let sum_rotate = num_interval_arr.length;
    // 每一圈所需要的时间
    let interval = 0;
    num_interval_arr.forEach((delay, index) => {
      setTimeout(() => {
        this.rotateCircle(delay, index + 1, sum_rotate, prize_id);
      }, interval);
      //因为每一圈转完所用的时间是不一样的,所以要做一个叠加操作
      interval += delay * 8;
    });
  },

  /**
   *
   * @param {*} delay 表示一个奖品跳到另一个奖品所需要的时间
   * @param {*} index 表示执行到第几圈
   * @param {*} sum_rotate 表示旋转的总圈数
   * @param {*} prize_id 中奖的id号
   */
  rotateCircle(delay, index, sum_rotate, prize_id) {
    // console.log(index)
    let _this = this;
    /*
     * 页面中奖项的实际数组下标
     * 0  1  2
     * 3     5
     * 6  7  8
     * 所以得出转圈的执行顺序数组为 ↓
     */
    let order_arr = [0, 1, 2, 5, 8, 7, 6, 3];
    // 页面奖品总数组
    let tableList = this.data.tableList;
    // 如果转到最后一圈,把数组截取到奖品项的位置
    if (index == sum_rotate) {
      order_arr.splice(prize_id);
    }
    console.log(order_arr);
    for (let i = 0; i < order_arr.length; i++) {
      setTimeout(() => {
        // 清理掉选中的状态
        tableList.forEach((e) => {
          e.isSelected = false;
        });
        // 执行到第几个就改变它的选中状态
        tableList[order_arr[i]].isSelected = true;
        // 更新状态
        _this.setData({
          tableList: tableList,
        });
        // 如果转到最后一圈且转完了,把抽奖状态改为已经转完了
        if (index == sum_rotate && i == order_arr.length - 1) {
          _this.setData({
            isTurnOver: true,
          });
        }
      }, delay * i);
    }
  },
});
javascript 复制代码
.table-list {
  width: 100%;
  box-sizing: border-box;
  .table-item {
    width: 200rpx;
    height: 200rpx;
    margin-bottom: 10rpx;
    background-color: orange;
    color: #fff;
    border:5rpx solid snow;
  }
  .table-item.btn {
    background-color: gold;
  }
  .table-item.selected {
    background-color: orangered;
  }
  .table-item.turn {
    background-color: goldenrod;
  }
相关推荐
Jing_Rainbow2 小时前
【Weapp-2 /Lesson19(2025-11-04)】微信小程序“博客园”项目深度解析:从架构到细节的完整剖析📱
微信·微信小程序·程序员
小皮虾3 小时前
拒绝卡顿!小程序图片本地“极速”旋转与格式转换,离屏 Canvas 性能调优实战
前端·javascript·微信小程序
毕设源码-邱学长6 小时前
【开题答辩全过程】以 基于微信小程序的农商新闻网为例,包含答辩的问题和答案
微信小程序·小程序
小光学长6 小时前
基于微信小程序的家具商城系统g80l9675(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·微信小程序·小程序
云起SAAS6 小时前
1V1七彩测评抖音快手微信小程序看广告流量主开源
微信小程序·小程序·ai编程·看广告变现轻·1v1七彩测评
sheji34166 小时前
【开题答辩全过程】以 基于微信小程序的签到系统的设计与实现为例,包含答辩的问题和答案
微信小程序·小程序
说私域8 小时前
基于开源链动2+1模式AI智能名片S2B2C商城小程序的社群运营创新研究
人工智能·小程序·开源
chinrock8 小时前
如何抓包飞书小程序-飞书开发者工具
小程序·飞书
Jing_Rainbow1 天前
【 Weapp-1 /Lesson18(2025-11-03)】# 微信小程序开发全解析:从项目结构到生态优势 🚀
微信·微信小程序·程序员
千寻技术帮1 天前
50045_基于微信小程序的民宿预订管理系统
微信小程序·源码·ppt·项目文档·民宿