| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 | // components/raffleWheel/raffleWheel.js//创建并返回内部 audio 上下文 innerAudioContext 对象const start = wx.createInnerAudioContext();const mid = wx.createInnerAudioContext();const stop = wx.createInnerAudioContext();var http = require('../../../utils/http.js')Component({  options: {    multipleSlots: true // 在组件定义时的选项中启用多slot支持  },  /**   * 组件的属性列表   * 用于组件自定义设置   组件的对外属性   */  properties: {    myProperty: { // 属性名        myProperty2: String, 简化的定义方式      type: String, // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型)      value: '', // 属性默认 初始值(可选),如果未指定则会根据类型选择一个      observer: function (newVal, oldVal, changedPath) {        // 属性被改变时执行的函数(可选),也可以写成在methods段中定义的方法名字符串, 如:'_propertyChange'        // 通常 newVal 就是新设置的数据, oldVal 是旧数据      }    },    size: {      type: Number, // 转盘大小,传入宽度即可      value: 600    },  },  /**   * 私有数据,组件的初始数据   * 可用于模版渲染   */  data: {    awardsConfig: {      option: '', //转盘的标题名称      awards: []    },    animationData: {}, // 转盘动画    zhuanflg: false, // 转盘是否可以点击切换的标志位    // fastTime: 7600,    // 转盘快速转动的时间    fastTime: 3900, // 转盘快速转动的时间    slowTime: 3900, // 转盘慢速转动的时间    runDegs: 0, // 转盘旋转了多少圈    timer: null, // 清除转盘的时间clearTimeout(timer)    block1: 'block', // 控制显示或隐藏转盘中心的图片    block2: 'none',    block3: 'none',    block4: 'none'  },  //组件生命周期函数,在组件实例进入页面节点树时执行,注意此时不能调用 setData  created: function () {},  // 组件生命周期函数,在组件实例进入页面节点树时执行  attached: function () {    this.getScoreLuckPrizes()  },  /**   * 组件的方法列表   * 更新属性和数据的方法与更新页面数据的方法类似   */  methods: {    /*     * 公有方法     */    //判断值是否为空    isNull(str) {      if (str == null || str == undefined || str == '') {        return true;      } else {        return false;      }    },    //初始化数据    initAdards() {      var that = this,        awardsConfig = that.data.awardsConfig;      var t = awardsConfig.awards.length; // 选项长度      var e = 1 / t,        i = 360 / t,        r = i - 90;      for (var g = 0; g < t; g++) {        awardsConfig.awards[g].item2Deg = g * i + 90 - i / 2 + "deg";        //当前下标 * 360/长度 + 90 - 360/长度/2        awardsConfig.awards[g].afterDeg = r + "deg";        awardsConfig.awards[g].opacity = '1';      }      that.setData({        turnNum: e, // 页面的单位是turn        awardsConfig: awardsConfig,      })      that._change(); //向父组件传出当前转盘的初始数据    },    //重置转盘    reset() {      var that = this,        awardsConfig = that.data.awardsConfig;      var animation = wx.createAnimation({        duration: 1,        timingFunction: "ease"      });      that.animation = animation;      animation.rotate(0).step(), that.data.runDegs = 0;      that.setData({        animationData: animation.export(),        block3: 'none',        block4: 'block'      })      for (let x in awardsConfig.awards) {        awardsConfig.awards[x].opacity = '1';      }      setTimeout(function () {        that.setData({          block1: 'block',          block4: 'none',          awardsConfig: awardsConfig,        })      }, 300)    },    //父组件需要切换当前转盘的选项    //如果有需要切换不同转盘的选项时,可以调用这方法    //data: 转盘的数据    //flag: 当转盘在转动过程中如果你想停止的话,可以传个true值,默认可不传    switchZhuanpan(data, flag) {      this.setData({        awardsConfig: data,        block1: 'block',        block1: 'none',        block3: 'none',        block4: 'none',        zhuanflg: false,      })      this.initAdards();      if (flag) {        this.reset();        clearTimeout(this.data.timer);        start.stop();        mid.stop();        stop.stop();      }    },    /*     * 内部私有方法建议以下划线开头     * triggerEvent 用于触发事件,过triggerEvent来给父组件传递信息的     * 写法: this.triggerEvent('cancelEvent', { num: 1 })  // 可以将num通过参数的形式传递给父组件     */    // GO转盘开始转动    _zhuan() {      var that = this,        awardsConfig = that.data.awardsConfig,        runDegs = that.data.runDegs;      //>>> 是无符号移位运算符      var r = Math.random() * awardsConfig.awards.length >>> 0,        runNum = 8;      console.log('当前答案选项的下标=====', r);      setTimeout(function () {        //要转多少度deg        runDegs = runDegs || 0, runDegs = runDegs + (360 - runDegs % 360) + (2160 - r * (360 / awardsConfig.awards.length));        var animation = wx.createAnimation({          duration: that.data.fastJuedin ? that.data.slowTime : that.data.fastTime,          timingFunction: "ease"        });        that.animation = animation;        //这动画执行的是差值        //如果第一次写rotate(360) 那么第二次再写rotate(360)将不起效果        animation.rotate(runDegs).step(), 0 == r && (runDegs = 0);        that.setData({          animationData: animation.export(),          block1: 'none',          block2: 'block',          zhuanflg: true,        })        that._setatZhuan(true);      }, 100);      that.setData({        timer: setTimeout(function () {          that.setData({            animationData: {},            s_awards: awardsConfig.awards[r].prizeName, //最终选中的结果            awardsConfig: awardsConfig,            block2: 'none',            block3: 'block',            zhuanflg: false,          })          that._myAwards();        }, that.data.fastJuedin ? that.data.slowTime : that.data.fastTime)      })    },    //初始化数据时向外传的参    _change() {      this.triggerEvent('myData', this.data.awardsConfig); // 向父组件传出当前转盘的数组数据    },    //当前转盘的结果    _myAwards() {      this.triggerEvent('myAwards', this.data.s_awards)    },    //转盘开始转动或者结速转动后的要传的值    _setatZhuan(e) {      console.log(e)      var params = {        url: '/p/scoreLuck/raffle',        method: 'GET',        data: {          addId: 0        },        callBack: res => {          setTimeout(() => {            if (res.stock) {              wx.showModal({                title: '运气爆棚!',                showCancel: false,                content: res.prizeName,                success: () => {                  this.reset()                }              })            } else {              wx.showModal({                title: '谢谢参与',                showCancel: false,                content: '运气留给下次吧~',                success: () => {                  this.reset()                }              })            }          }, 2400)        },        errCallBack:(err)=>{          console.log(err)          wx.showModal({            title: '错误',            showCancel: false,            content: '服务器开了点小差,待会儿再来吧~',            success: () => {              this.reset()            }          })        }      }      http.request(params)    },    // 获取抽奖奖品列表    getScoreLuckPrizes() {      var params = {        url: '/p/scoreLuck/getScoreLuckPrizes',        method: 'GET',        data: {          consumeType: 1        },        callBack: res => {          res.forEach((el, index) => {            if (index % 2 === 0) {              el['color'] = "#FEFAEA"            } else {              el['color'] = '#FFE358'            }          })          this.setData({            'awardsConfig.awards': res          })          this.initAdards();        }      }      http.request(params)    },  }})
 |