美文网首页
mpvue封装九宫格抽奖组件

mpvue封装九宫格抽奖组件

作者: 嗷呜的伍 | 来源:发表于2019-08-19 16:20 被阅读0次

最近用mpvue做小程序,有一个需求是做九宫格抽奖。因此参考了一篇文章从而封装了一个九宫格抽奖组件,可以直接拿来用。废话不再多说。直接上图上代码。

九宫格组件html代码:

<template>
  <div class="container" :style="{width:width,height:height}">
    <!-- 背景图 -->
    <image :src="backgroundImageUrl" model="aspectFill" class="background_image" v-if="backgroundImageUrl"></image>
    <!-- 九宫格 -->
    <div class='sudoku'>
        <div class="square" :style="{opacity:activatedColorIndex==0?'1': ( startGame ? '0.5' : '1' ),width:squareWidth,height:squareHeight,marginLeft:squareMarginLeft,marginBottom:squareMarginBottom}">
          <image :src="prizeImages[0]" model="aspcetFit"></image>       
        </div>
        <div class="square" :style="{opacity:activatedColorIndex==1?'1': ( startGame ? '0.5' : '1' ),width:squareWidth,height:squareHeight,marginLeft:squareMarginLeft,marginBottom:squareMarginBottom}">
          <image :src="prizeImages[1]" model="aspcetFit"></image>
        </div>
        <div class="square" :style="{opacity:activatedColorIndex==2?'1': ( startGame ? '0.5' : '1' ),width:squareWidth,height:squareHeight,marginLeft:squareMarginLeft,marginBottom:squareMarginBottom}">
          <image :src="prizeImages[2]" model="aspcetFit"></image>
        </div>
        <div class="square" :style="{opacity:activatedColorIndex==7?'1': ( startGame ? '0.5' : '1' ),width:squareWidth,height:squareHeight,marginLeft:squareMarginLeft,marginBottom:squareMarginBottom}">
          <image :src="prizeImages[7]" model="aspcetFit"></image>
        </div>
        <div class="square" @click="clickLuck" :style="{width:squareWidth,height:squareHeight,marginLeft:squareMarginLeft,marginBottom:squareMarginBottom}">
          <image :src='lotteryButtonImage' model="aspcetFit"></image>
        </div>
        <div class="square" :style="{opacity:activatedColorIndex==3?'1': ( startGame ? '0.5' : '1' ),width:squareWidth,height:squareHeight,marginLeft:squareMarginLeft,marginBottom:squareMarginBottom}">
          <image :src="prizeImages[3]" model="aspcetFit"></image>
        </div>
        <div class="square marginBottomNo" :style="{opacity:activatedColorIndex==6?'1': ( startGame ? '0.5' : '1' ),width:squareWidth,height:squareHeight,marginLeft:squareMarginLeft,marginBottom:squareMarginBottom}">
          <image :src="prizeImages[6]" model="aspcetFit"></image>
        </div>
        <div class="square marginBottomNo" :style="{opacity:activatedColorIndex==5?'1': ( startGame ? '0.5' : '1' ),width:squareWidth,height:squareHeight,marginLeft:squareMarginLeft,marginBottom:squareMarginBottom}">
          <image :src="prizeImages[5]" model="aspcetFit"></image>
        </div>
        <div class="square marginBottomNo" :style="{opacity:activatedColorIndex==4?'1': ( startGame ? '0.5' : '1' ),width:squareWidth,height:squareHeight,marginLeft:squareMarginLeft,marginBottom:squareMarginBottom}">
          <image :src="prizeImages[4]" model="aspcetFit"></image>
        </div>
    </div>
  </div>
</template>

九宫格组件js代码:

<script>
/*
 * @Author: wujiayi
 * @Date: 2019-08-19
 * @Last Modified by: wujiayi
 * @Last Modified time: 2019-08-19
 */

//定时器
let interval = null;
let timer = null;
//九宫格旋转速度,值越大速度越慢
let rotationalSpeed = 30;

export default {
    props:{
        width:{ //九宫格容器宽度
            type:String,
            default:'100%',
        },
        height:{ //九宫格容器高度
            type:String,
            default:'100%',
        },
        backgroundImageUrl:{ //九宫格容器背景图片
            type:String,
            default:'',
        },
        squareWidth:{ //九宫格格子宽度
            type:String,
            default:'31.28%',
        },
        squareHeight:{ //九宫格格子高度
            type:String,
            default:'200rpx',
        },
        squareMarginLeft:{ //九宫格格子左边距
            type:String,
            default:'3.08%',
        },
        squareMarginBottom:{ //九宫格格子下边距
            type:String,
            default:'20rpx',
        },
        bgColor:{ //九宫格格子背景颜色
            type:String,
            default:'none',
        },
        prizeImages:{ //奖品列表图片
            type:Array
        },
        lotteryButtonImage:{ //抽奖按钮图片
            type:String,
        },
        lotteryCount:{ //抽奖次数
            type:Number,
            default:0,
        },
    },

  data() {
    return {
      activatedColorIndex: -1, //当前位置选中状态
      btnDisabled:false,//抽奖按钮是否可以点击
      startGame:false,//是否正在抽奖
    };
  },
  methods: {
    //点击抽奖按钮
    clickLuck() {
      let that = this;
      //判断是否可以点击抽奖按钮
      if (that.lotteryCount<=0) {
          mpvue.showToast({
              title:'抽奖次数为0,不可抽奖!',
              icon:'none'
          })
          return
      }
      if (this.btnDisabled) {
          return
      }

      this.btnDisabled = !this.btnDisabled;
      this.startGame = true;
      that.lotteryCount--;
      interval && clearInterval(interval);
      // 九宫格旋转(设置当前位置选中状态)
      let index = 0;
      interval = setInterval(function() {
        if (index > 7) {
          index = 0;
        }
        that.activatedColorIndex = index;
        index++;
      }, rotationalSpeed);
      that.$emit('getlotteryPosition')
    },

    // 九宫格旋转减速
    stop(lotteryPosition) {
      let that = this;
      interval && clearInterval(interval);
      let currentIndex = that.activatedColorIndex + 1;
      that.stopLuck(lotteryPosition, currentIndex, rotationalSpeed, 30);
    },

    /**
     * lotteryPosition:中奖位置
     * currentIndex:当前选中位置
     * speed:九宫格旋转速度
     * stepTime:每次增加的旋转时间 值越大旋转速度越慢
     */
    stopLuck(lotteryPosition, currentIndex, speed, stepTime) {
      let that = this;
      timer && clearTimeout(timer);
      timer = setTimeout(()=> {

        if (currentIndex > 7) {
          currentIndex = 0;
        } 

        //当前位置为选中状态
        that.activatedColorIndex = currentIndex;

        //如果旋转时间过短或者当前位置不等于中奖位置则递归执行直到旋转至中奖位置
        if (speed < 300 || currentIndex != lotteryPosition) {
          //旋转速度越来越慢
          stepTime++;
          speed += stepTime;
          //当前位置+1
          currentIndex++;
          that.stopLuck(lotteryPosition, currentIndex, speed, stepTime);
        } else {
            //抽奖结束
            //假设中奖
            setTimeout(()=>{
              mpvue.showModal({
                title: '恭喜中奖',
                content: '恭喜您获得xxx',
                showCancel: false,
                success: function(res) {
                  if (res.confirm) {
                      that.activatedColorIndex = -1;
                      that.btnDisabled = !that.btnDisabled;
                      that.startGame = false;   
                  }
                }
              })
            },500)
          }
      }, speed);
    }
  }
};
</script>

九宫格组件css代码:


<style lang="less" scoped>
.container {
  position: relative;
  margin: auto;
  > .background_image {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
  }
  > .sudoku {
    width: 100%;
    display: flex;
    flex-wrap: wrap;
    position: relative;
    z-index: 2;
    > .square {
      border-radius: 20rpx;
      box-shadow: 0 0 6rpx #e6e6e6;
      &:nth-of-type(3n-2) {
        margin-left: 0 !important;
      }
      > image {
        width: 100%;
        height: 100%;
      }
    }
    > .marginBottomNo {
      margin-bottom: 0 !important;
    }
  }
}
</style>

使用组件demo

<template>
  <div style="width:100%;padding:0 40rpx;">
    <lottery ref="lottery" @getlotteryPosition = "getlotteryPosition" :lotteryCount="lotteryCount" :prizeImages="prizeImages" :lotteryButtonImage="lotteryButtonImage"></lottery>
  </div>
</template>

<script>
import lottery from '@/components/lottery';

export default {
  components:{
    lottery
  },
  data() {
    return {
      lotteryCount:99,//抽奖次数
      prizeImages:["https://xxx","https://xxx","https://xxx"...], //奖品列表图片
      lotteryButtonImage:"https://xxx",//抽奖按钮图片
    };
  },
  methods: {
    getlotteryPosition(){
      let that = this;
      //模拟网络请求时间
      setTimeout(function() {
        // 中奖位置
        let lotteryPosition = Math.floor(Math.random()*5)+Math.floor(Math.random());
        that.$refs.lottery.stop(lotteryPosition);
      }, 1000);
    }
  }
};
</script>

参考文章链接 :微信小程序九宫格抽奖

相关文章

  • mpvue封装九宫格抽奖组件

    最近用mpvue做小程序,有一个需求是做九宫格抽奖。因此参考了一篇文章从而封装了一个九宫格抽奖组件,可以直接拿来用...

  • 使用mpvue来实现九宫格抽奖功能

    今天来封装一个九宫格抽奖的组件 随时用随时拿。 效果图 实现原理 1.将奖品按照抽奖转动的顺序通过css去定位 2...

  • 基于mpvue二次封装的模板

    mpvue 我个人封装了一个模板: 1.包含了几个组件 自定义键盘、顶部菜单 日历 可以半星的评分组件 等 2.对...

  • mpvue系列(三):组件、数据交互

    1、mpVue项目组件的使用? (1) mpvue 可以支持小程序的原生组件,比如: picker,map、swi...

  • vue封装menulist组件

    项目中需要封装一个九宫格的组件,需要name,imgurl,url三个参数。在用flex布局确定好总体布局后,封装...

  • 小程序组件大全

    1、营销组件--大转盘、刮刮乐、老虎机、跑马灯、九宫格、翻. GitHub 2、weapp微信小程序组件和功能封装...

  • mpvue框架

    【最近更新】mpvue入门系列教程: 如何在mpvue中正确的引用小程序的原生自定义组件 使用mpvue开发小程序...

  • 封装组件

    封装tab组件封装曝光加载组件封装轮播组件 代码

  • 面向对象实战

    封装轮播组件 轮播 封装曝光加载组件 曝光加载 封装Tab 组件 Tab组件

  • vue组件 九宫格抽奖

    无图无真相!!! 环境 vue 2.xscss 组件 LzLuckyDraw.vue 使用 默认为顺时针顺序抽奖,...

网友评论

      本文标题:mpvue封装九宫格抽奖组件

      本文链接:https://www.haomeiwen.com/subject/rucesctx.html