忽然想写一个对于抽奖的货色,借鉴了其余大佬的实现。做的一个概率类型的抽奖,css跟数据都是瞎弄的。不想优化了。哈哈哈哈

<template>  <div class="home_page">    <!--    <headerPage />-->    <content-page>      <div>抽奖测试</div>      <div class="choujiang">        <ul class="ul">          <li            v-for="(item,i) in arr"            :key="i"            :class="{isActive:i === index }"            class="li"          > {{ item }} </li>        </ul>      </div>      <!--      <div v-show="isShow" class="begin" @click="begin">开始抽奖</div>-->      <!--      <div v-show="!isShow" class="begin" @click="stop">完结抽奖</div>-->      <div v-show="isShow" class="begin" @click="startLottery">开始抽奖</div>    </content-page>  </div></template><script>// import headerPage from '../components/header_page'import contentPage from '../components/content_page'// import footerPage from '../components/footer_page'export default {  name: 'Home',  components: {    // headerPage,    contentPage,    // footerPage,  },  data() {    return {      arr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],      isShow: true,      randomIndex: -1,      curIndex: 0,      // timer: '',      /** 批改版本 **/      index: -1, // 以后转动到哪个地位,终点地位      count: 10, // 总共有多少个地位      timer: 0, // 每次转动定时器      speed: 200, // 初始转动速度      times: 0, // 转动次数      cycle: 50, // 转动根本次数:即至多须要转动多少次再进入抽奖环节      prize: -1, // 中奖地位      click: true,      showToast: false, // 显示中奖弹窗    }  },  computed: {},  create() {  },  mounted() {  },  methods: {    startLottery() {      if (!this.click) { return }      this.startRoll()    },    // 开始转动    startRoll() {      this.times += 1 // 转动次数      this.oneRoll() // 转动过程调用的每一次转动办法,这里是第一次调用初始化      // 如果以后转动次数达到要求 && 目前转到的地位是中奖地位      if (this.times > this.cycle && this.prize === this.index) {        this.$message({          type: 'success ',          message: `中将号码: ${this.index}`,        })        // console.log('中奖了')        // console.log(this.index)        // console.log(this.prize)        // console.log(this.times)        // console.log(this.speed)        clearTimeout(this.timer) // 革除转动定时器,进行转动        this.prize = -1        this.times = 0        this.speed = 200        this.click = true        var that = this        setTimeout(() => {          that.showToast = true        }, 500)      } else {        if (this.times < this.cycle) {          this.speed -= 10 // 放慢转动速度        } else if (this.times === this.cycle) {          // const index = parseInt(Math.random() * 10, 0) || 0 // 随机取得一个中奖地位          this.prize = this.random() // 中奖地位,可由后盾返回          if (this.prize > 9) { this.prize = 9 }        } else if (this.times > this.cycle && ((this.prize === 0 && this.index === 9) || this.prize === this.index + 1)) {          this.speed += 110        } else {          this.speed += 20        }        if (this.speed < 40) { this.speed = 40 }        this.timer = setTimeout(this.startRoll, this.speed)      }    },    // 每一次转动    oneRoll() {      let index = this.index // 以后转动到哪个地位      const count = this.count // 总共有多少个地位      index += 1      if (index > count - 1) { index = 0 }      this.index = index    },    /** 生成概率的数据 **/    random() {      const arr1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] // 对应的奖品号码      const arr2 = [0.02, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.01, 0.07, 0.3] // 奖品号码的概率      let sum = 0      let factor = 0      let random = Math.random()      for (let i = arr2.length - 1; i >= 0; i--) {        sum += arr2[i] // 统计概率总和      }      random *= sum // 生成概率随机数(只是为了让定义的局部是个let)能够不写      for (let m = arr2.length - 1; m >= 0; m--) {        factor += arr2[m]        if (random <= factor) {          return arr1[m]        }      }      return null    },  },}</script><style scoped lang="scss">  @import "../assets/style/base.scss";  .home_page{    font-size: pxTorem(16px);    display: flex;    align-items: center;    justify-content: center;    .choujiang{      .ul{        width: pxTorem(240px);        display: flex;        flex-wrap: wrap;        .li{          padding: pxTorem(8px) pxTorem(20px);          margin: pxTorem(10px) pxTorem(10px);          /*background-color: salmon;*/          border: 1px solid;        }      }    }    .begin{      margin-top: pxTorem(40px);      padding: pxTorem(18px) pxTorem(24px);      background-color: salmon;      text-align: center;      cursor: pointer;    }  }  .isActive{    background-color: salmon;  }</style>