大家好!先上图看看本次案例的整体效果。

完整版实战课程附源码:【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖

实现思路:

  1. Vue component实现九宫格水果机组件,可以嵌套到任意要使用的页面。
  2. css3 transform控制九宫格水果机抽奖过程的动画效果。
  3. 抽奖组件内使用钩子函数watch监听抽奖结果的返回情况播放九宫格水果机动画并给用户弹出中奖提示。
  4. 中奖结果弹窗,为抽奖组件服务。

实现步骤如下:

  1. 构建api奖品配置信息和抽奖接口,vuex全局存放奖品配置和中奖结果数据信息。
    api:

    export default {
    getPrizeList () {
    let prizeList = [
    {
    id: 1,
    name: '小米8',
    img: 'https://i1.mifile.cn/f/i/g/2015/cn-index/m8-140.png'
    },
    {
    id: 2,
    name: '小米电视',
    img: 'https://i1.mifile.cn/f/i/g/2015/TV4A-43QC.png'
    }, {
    id: 3,
    name: '小米平衡车',
    img: 'https://i1.mifile.cn/f/i/g/2015/cn-index/scooter-140!140x140.jpg'
    }, {
    id: 4,
    name: '小米耳机',
    img: 'https://c1.mifile.cn/f/i/g/2015/video/pinpai140!140x140.jpg'
    }
    ]
    return prizeList
    },
    lottery () {
    return {
    id: 4,
    name: '小米耳机',
    img: 'https://c1.mifile.cn/f/i/g/2015/video/pinpai140!140x140.jpg'
    }
    }
    }

    store:

    import lotteryApi from '../../api/lottery.api.js'
    
    const state = {
    prizeList: [],
    lotteryResult: {}
    } const getters = {
    prizeList: state => state.prizeList,
    lotteryResult: state => state.lotteryResult
    } const mutations = {
    SetPrizeList (state, { prizeList }) {
    state.prizeList = prizeList
    },
    SetLotteryResult (state, { lotteryResult }) {
    state.lotteryResult = lotteryResult
    }
    } const actions = {
    getPrizeList ({ commit }) {
    let result = lotteryApi.getPrizeList()
    commit('SetPrizeList', { prizeList: result })
    },
    lottery ({ commit }) {
    let result = lotteryApi.lottery()
    commit('SetLotteryResult', { lotteryResult: result })
    }
    } export default {
    state,
    getters,
    mutations,
    actions,
    namespaced: true
    }
  2. 编写抽奖组件,为保证通用性,组件只负责播放抽奖结果。接收两个数据和一个方法,如下:
    数据一:预置的奖品列表数据(轮播奖品需要)
    数据二:抽奖结果,播放抽奖动画和弹出中奖结果需要
    方法:抽奖动作,返回的抽奖结果数据即为数据二,响应式传递给组件
    大概代码思路如下(仅供参考,不可运行)
    <template>
    <div class="main">
    <div class="squared"
    v-if="slotPrizes.length>0">
    <ul class="squared-warpper">
    <li class="squared-item"
    v-for="(item,index) in slotPrizes"
    v-bind:key="index">
    <img class="squared-item-btn"
    @click="parentEmitLottery()"
    v-if="index==4"
    src="//images.cnblogs.com/cnblogs_com/codeon/878827/t_startLottery.jpg">
    <div v-if="index!=4"
    class="squared-item-prise"
    :class="item.slotIndex==playIndex ? 'on':''">
    <img :src="item.img">
    </div>
    </li>
    </ul>
    </div>
    <prize-pop :prize="lotteryResult"
    v-if="showPrize"
    @closeLotteryPop="showPrize=false" />
    </div>
    </template>
    <script>
    import PrizePop from './common/prize-pop.vue'
    export default {
    name: 'FruitMachine',
    data () {
    return {
    isStart: false,
    showPrize: false,
    count: 0, // 移动总次数
    prizeIndex: -1, // 中奖的奖品索引
    timeOut: 100, // 延迟执行时间
    endingTimeOut: 200, // 最后一圈延迟执行时间
    intervalCount: 4, // 循环轮播次数
    playIndex: 0 // 当前移动的索引
    }
    },
    components: {
    PrizePop
    },
    props: {
    prizes: {
    type: Array,
    required: false
    },
    lotteryResult: {
    type: Object,
    default: () => { }
    }
    },
    computed: {
    slotPrizes () {
    let prize = []
    var self = this
    console.log(self.prizes)
    if (self.prizes.length > 0) {
    prize.push({ ...self.prizes[0], slotIndex: 1 })
    prize.push({ id: -1, slotIndex: 2, img: '//www.cnblogs.com/images/cnblogs_com/codeon/878827/t_thanksAccept.png' })
    prize.push({ ...self.prizes[1], slotIndex: 3 })
    prize.push({ id: -1, slotIndex: 8, img: '//www.cnblogs.com/images/cnblogs_com/codeon/878827/t_thanksAccept.png' })
    prize.push({ id: -1, slotIndex: -1, img: '//www.cnblogs.com/images/cnblogs_com/codeon/878827/t_thanksAccept.png' })
    prize.push({ id: -1, slotIndex: 4, img: '//www.cnblogs.com/images/cnblogs_com/codeon/878827/t_thanksAccept.png' })
    prize.push({ ...self.prizes[3], slotIndex: 7 })
    prize.push({ id: -1, slotIndex: 6, img: '//www.cnblogs.com/images/cnblogs_com/codeon/878827/t_thanksAccept.png' })
    prize.push({ ...self.prizes[2], slotIndex: 5 })
    }
    return prize
    }
    },
    methods: {
    /**
    * 触发父页面调用抽奖
    */
    parentEmitLottery () {
    this.$emit('lottery')
    },
    /**
    * 开始抽奖
    */
    startLottery () {
    },
    /**
    * 获取中奖结果所在奖品列表中的索引,以确定抽奖动画最终落在哪个奖品
    */
    getPrizeIndex () {
    },
    /**
    * 执行抽奖动画
    */
    intervalPlay() {
    }
    },
    watch: {
    lotteryResult (newVal, oldVal) {
    if (newVal.id && newVal.id > 0) {
    this.startLottery()
    }
    }
    }
    }
    </script>
  3. 弹出中奖结果组件,依附于抽奖组件,在上一步的执行抽奖结果动画结束后执行。
    <template>
    <div class="subject-pop" style="z-index: 10;" v-if="prize.id>0">
    <div class="subject-pop-mask"></div>
    <div class="subject-pop-box">
    <h3>恭喜您</h3>
    <p>
    <img :src="prize.img" alt>
    </p>
    <h4>获得
    <span></span>
    <span>{{prize.name}}</span>
    </h4>
    <div class="subject-pop-footer">
    <a href="javascript:;" class="november-btn1" @click="closeLotteryEmit">知道了</a>
    </div>
    </div>
    </div>
    </template>
    <script>
    export default {
    props: {
    prize: {
    type: Object,
    default: () => {
    return {
    id: 0
    }
    }
    }
    },
    methods: {
    closeLotteryEmit () {
    this.$emit('closeLotteryPop')
    }
    }
    }
    </script>
  4. 抽奖组件运用在需要使用的页面中,此页面需要为抽奖组件提前准备好预置奖品列表和中奖结果信息,并提供好抽奖方法供子组件(抽奖组件)触发,触发完更改抽奖结果响应式传入到抽奖组件中。
    <template>
    <section>
    <div style="width:100%;text-align:center;margin:2rem 0;">您有一次抽奖机会,祝君好运~~~</div>
    <FruitMachine v-bind:prizes="prizeList"
    v-bind:lotteryResult="lotteryResult"
    v-on:lottery="lottery" />
    </section>
    </template> <script>
    import { mapGetters, mapActions } from 'vuex'
    import FruitMachine from '@/components/fruitMachine'
    export default {
    data () {
    return { }
    },
    created () {
    var self = this
    self.getPrizeList()
    },
    components: {
    FruitMachine
    },
    computed: {
    ...mapGetters({
    prizeList: 'lottery/prizeList',
    lotteryResult: 'lottery/lotteryResult'
    })
    },
    methods: {
    ...mapActions({
    getPrizeList: 'lottery/getPrizeList',
    lottery: 'lottery/lottery'
    })
    }
    }
    </script>

以上就是九宫格水果机抽奖核心步骤的整体思路,欢迎讨论。

完整版九宫格水果机实战课程附源码:【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖

Vue.js实战之游戏抽奖系列全集

↓↓↓↓↓↓↓↓↓↓↓

【Vue.js游戏机实战】- Vue.js实现老虎-机抽奖总结

【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖游戏总结

【Vue.js游戏机实战】- Vue.js实现大转盘抽奖总结

【Vue.js游戏机实战】- Vue.js实现九宫格水果机抽奖游戏总结的更多相关文章

  1. 【Vue.js游戏机实战】- Vue.js实现老虎-机抽奖总结

    大家好!先上图看看本次案例的整体效果. 完整版实战课程附源码:[Vue.js游戏机实战]- Vue.js实现老虎-机抽奖 实现思路: Vue component实现老虎-机组件,可以嵌套到任意要使用的 ...

  2. 【Vue.js游戏机实战】- Vue.js实现大转盘抽奖总结

    大家好!先上图看看本次案例的整体效果. 实现思路: Vue component实现大转盘组件,可以嵌套到任意要使用的页面. css3 transform控制大转盘抽奖过程的动画效果. 抽奖组件内使用钩 ...

  3. Vue.js起手式+Vue小作品实战

    本文是小羊根据Vue.js文档进行解读的第一篇文章,主要内容涵盖Vue.js的基础部分的知识的,文章顺序基本按照官方文档的顺序,每个知识点现附上代码,然后根据代码给予个人的一些理解,最后还放上在线编辑 ...

  4. 08Vue.js快速入门-Vue综合实战项目

    8.1. 前置知识学习 npm 学习 官方文档 推荐资料 npm入门 npm介绍 需要了解的知识点 package.json 文件相关配置选项 npm 本地安装.全局安装.本地开发安装等区别及相关命令 ...

  5. 每天记录一点:NetCore获得配置文件 appsettings.json vue-router页面传值及接收值 详解webpack + vue + node 打造单页面(入门篇) 30分钟手把手教你学webpack实战 vue.js+webpack模块管理及组件开发

    每天记录一点:NetCore获得配置文件 appsettings.json   用NetCore做项目如果用EF  ORM在网上有很多的配置连接字符串,读取以及使用方法 由于很多朋友用的其他ORM如S ...

  6. 分享Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站

    这是个什么的项目? 使用 Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站. 博客线上地址:www.boblog.com Github地址:https: ...

  7. 第10章-Vue.js 项目实战

    一.本节内容 掌握项目环境中路由的配置方法 ***** 熟练掌握编写单文件组件的编写 *** 能够使用swiper.js进行轮播图组件的封装 能够使用axios进行数据请求 二.webpack项目的目 ...

  8. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十七 ║Vue基础:使用Vue.js 来画博客首页+指令(一)

    缘起 书说前两篇文章<十五 ║ Vue前篇:JS对象&字面量&this>和 <十六 ║ Vue前篇:ES6初体验 & 模块化编程>,已经通过对js面向对 ...

  9. Vue的理解:Vue.js新手入门指南----转

    最近在逛各大网站,论坛,以及像SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,楼主自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在 ...

随机推荐

  1. 将H5页面打包成安卓原生app

    第一步:下载HBuilderX,新建项目选择5+App新建一个空项目如下图 新建后项目目录结构如下图 第二步,将你要打包成安卓app的文件打包,最后生成的文件目录如下图 1.打包完成后,将对应文件内容 ...

  2. SSM框架之MyBatis入门介绍

    一.什么是MyBatis? MyBatis源自Apache的iBatis开源项目, 从iBatis3.x开始正式更名为MyBatis.它是一个优秀的持久层框架. 二.为什么使用MyBatis? 为了和 ...

  3. Python学习资料收集

    1.Learn Python the hard way 2.Google's Python lesson 3.Python最佳实践 4.Full Stack Python 5.explore flas ...

  4. 导出带图片的Excel——OOXML文件分析

    需求: 普通js导出文件excel具有兼容性问题,通过js-xsl导出文件API未找到导出图片的方案,实例过少,因此针对07年后以.xlsx后缀的excel文件,通过修改后缀.zip参考文件模板来实现 ...

  5. 用java代码实现构造目录树

    怎么用java代码实现上面这样的目录树? 首先创建数据表 每条数据记录自己的id以及父节点的id 然后进入java代码部分: public String directory(String author ...

  6. 在SQL查询结果中添加自增列的两种方法

    解决办法<一>:如果想查询出这个表的信息,并添加一列连续自增的ID,可用如下查询语句: SELECT Row_Number() over ( order by getdate() ) as ...

  7. Mysql 存储过程 + python调用存储过程 (内置函数讲解及定义摘抄)

    定义 存储过程:就是为以后的使用而保存的一条或多条 MySQL语句的集合.可将其视为批文件,虽然它们的作用不仅限于批处理. 个人使用存储过程的原因就是因为 存储过程比使用单独的SQL语句要快 有如下表 ...

  8. oracle 设置归档日模式

    首先关闭ORACLE SQL> shutdown immediate 把ORACLE启动为MOUNT模式 SQL:>startup mount sql:> alter databas ...

  9. c# Path类

  10. ssh本机失败(ssh: connect to host localhost port 22: Connection refused)

    ssh本机失败(ssh: connect to host localhost port 22: Connection refused) 一. 问题描述 之前一直在服务上使用宝塔面板, 今天突发奇想, ...