最近工作中有个9宫格抽奖的需求,一开始没啥思绪,网上查阅一番,自己又修改了一下,希望与大家交流分享。

先看一下效果图

整理一下思路

利用flex布局形成9宫格,每个格子的序号为0~8,创建一个记录当前指针的变量,点击抽奖,指正转动,当index等于变量的时候让当前格子与其他格子样式不一致,当请求后台有结果时,让指针等于结果值。

上图中黑色数组代表奖品元素排列的顺序,其中4为抽奖按钮,红色数字则为指针转动的路线。

上代码:

首先定义几个变量

constructor (props) {

super(props)

this.state = {

timer1: '', // 定时器1 快速旋转

timer2: '', // 定时器2 慢速旋转

prizeIndex: 0, // 转动指针

stopIndex: null, // 抽中奖品

arrNum: [0, 1, 2, 5, 8, 7, 6, 3], // 转动顺序

luckList: [], // 奖品集合

isRolling: false // 是否正在抽奖

}

// 这边绑定是必要的,这样 `this` 才能在回调函数中使用

this.drawPrize = this.drawPrize.bind(this);

this.move = this.move.bind(this);

this.lowSpeed = this.lowSpeed.bind(this);

}

复制代码

然后根据数据写DOM渲染的条件

因为后台返回数据只有8条奖品,所以再获取奖品集合时对数据做一些改变,这个根据实际情况而定

res.data.dtls.splice(4, 0, {prizeName: "抽奖按钮", type: 0});

复制代码

这里利用type属性对奖品和抽奖按钮做区分

renderLi = () => {

let {luckList} = this.state;

return luckList.map((list, index) => {

if (list.type !== 0) {

return

{list.type===1||list.type===2?

:

list.type===3?

: ""

}

{list.prizeName}

} else {

return

}

})

}

复制代码

{this.renderLi()}

复制代码

点击抽奖按钮运行函数drawPrize

// 点击抽奖 执行快速转动,2秒后执行慢速转动

async drawPrize() {

if (!this.state.isRolling) {

this.setState({

prizeIndex: 0,

stopIndex: null,

isRolling: true,

timer1: setInterval(this.move, 100)

});

setTimeout(() => { //转一圈半之后降速

clearInterval(this.state.timer1);

this.lowSpeed()

}, 2000)

}

}

复制代码

慢速转动

lowSpeed() {//慢速转动

// 先清除快速转动的定时器

clearInterval(this.state.timer1);

// 请求接口,获取转动结果

api.lotteryId(this.state.lotteryId, token).then(res => {

if(res.resultCode === '0') {

let stopIndex = null

// 对转动结果做处理

switch (res.data) {

case 4:

stopIndex = 3

break;

case 7:

stopIndex = 4

break;

case 6:

stopIndex = 5

break;

case 5:

stopIndex = 6

break;

case 3:

stopIndex = 7

break;

case 0:

stopIndex = 0

break;

case 1:

stopIndex = 1

break;

case 2:

stopIndex = 2

break;

default:

stopIndex = null

break

}

// 得到结果再起调用move函数,速度降低

this.setState({

stopIndex: stopIndex,

timer2: setInterval(this.move, 300)

});

}

}

复制代码

执行转动函数move

move() {//转动

let luckList = this.state.luckList

let arrNum = this.state.arrNum

// chose=1为转动到位置,0为正常位置

luckList[arrNum[this.state.prizeIndex]].chose = 1

luckList[arrNum[this.state.prizeIndex-1<0?7:this.state.prizeIndex-1]].chose = 0

// 如果指针位置prizeIndex与结果位置相同,则抽奖完成,清除所有定时器

if (this.state.stopIndex !== null && (this.state.prizeIndex === this.state.stopIndex)) {

clearInterval(this.state.timer1);

clearInterval(this.state.timer2);

setTimeout(() => {

this.setState({

isRolling: false // 可以继续抽奖

})

}, 300);

}

// 否则,继续转动,这里需要对零界位置做一下处理

else {

this.setState({

prizeIndex: this.state.prizeIndex + 1 === 8 ? 0 : this.state.prizeIndex + 1

})

}

}

复制代码

另外需要在第二次点击时恢复状态值,我是在其他条件下做的处理,这个根据实际情况而定。

好了,一个简单的9宫格抽奖就完成了,有更好的,更丰富的方案的请不吝赐教。

java 9宫格抽奖_js 实现9宫格抽奖(react)相关推荐

  1. php9宫格抽奖程序_使用php控制抽奖系统

    一下观点都是小弟未经深思熟虑的考虑写的,如果不对的地方请指点.... 抽奖系统 俗称 大转盘 或 九宫格抽奖功能,大转盘或九宫格的功能我就不说了,网上插件有很多,也很简单,这里就简单的讲解一下思路 1 ...

  2. java写入excel文件,并填充空单元格颜色

    java写excel文件,并填充空单元格颜色 public static void main(String[] args) throws IOException {HSSFWorkbook workb ...

  3. java使用poi生成Excel文件并合并单元格

    java使用poi生成Excel文件并合并单元格        业务需要根据 分管部门 字段进行合并,现在提供一种思路. controller层 @Inject(target = "/inf ...

  4. java excel单元格背景色_POI 设置Excel单元格背景色(setFillForegroundColor)

    背景介绍: 使用Java开发信息系统项目,项目中往往会涉及到报表管理部分,而Excel表格首当其冲称为最合适的选择,但是对单元格操作时对于设置单元格的背景颜色却很少提及,本文旨在方便单元格背景颜色设计 ...

  5. java实现计算器的退格功能_帮忙看下这个java做的计算器为什么实现不了退格和清零功能,3q...

    已结贴√ 问题点数:5 回复次数:1 帮忙看下这个java做的计算器为什么实现不了退格和清零功能,3q import java.awt.*; import java.awt.event.*; publ ...

  6. java表格里面显示图片_jquery表格datagrid单元格显示图片及分页使用

    要想达到自定义显示表格框的目的比如显示图片,超链接,按钮的形式,只需要给列添加formatter属性即可,比如显示图片: columns: [[ { field: 'IName', title: '显 ...

  7. java 抽奖_java抽奖工具类:按概率抽奖

    在一些抽奖活动中,会有按概率抽取奖品的操作,本文将提供一个抽奖概率的解决方案. 假设抽奖集合如下: 奖品id 概率 1 10% 2 10% 3 20% 4 20% 生成集合 生成的连续集合为{(0.0 ...

  8. cxgrid中纵横单元格合并_被合并单元格折磨疯的我,真后悔没早点知道这个Excel技巧!...

    在大家日常的工作中,经常会用到Excel合并单元格,然而合并单元格其实只是美化了表格,它会使我们后续的统计工作遇到很多麻烦,今天就给大家提供两个解决这个问题的思路. 01 合并单元格的基本操作方法 在 ...

  9. vba字典合并单元格为空_VBA合并单元格求和处理套路

    在Excel中,合并单元格的使用会带来相当令人不爽的麻烦.但其使用率还是蛮高的. 如图,需要对部门的销售额做总计. Sub 樱桃小丸子() Dim arr, d As Object, i&, ...

最新文章

  1. jquery设置属性值或移除属性
  2. buu [BJDCTF 2nd]Y1nglish-y1ng
  3. C++ 流操作符重载函数
  4. 前端入门11-JavaScript语法之数组
  5. Linux_CentOS-服务器搭建 六
  6. [BZOJ1477] 青蛙的约会|扩展欧几里得算法
  7. C语言宏定义,内置宏的用法
  8. 学生选课系统项目分析-1,架构
  9. 基于偏微分方程的图像分割(二)Snake模型 Matlab实现
  10. 小型oa服务器系统,大型、中小型企业OA系统实施差异对比
  11. Android开发技巧 (四) —— 多窗口模式
  12. C语言书籍阅读-读书笔记--《C专家编程》
  13. Spring数据绑定之DataBinder篇---01
  14. CodeForces - 1467C(枚举,思维)
  15. Uniformly Distributed
  16. Tixati——BT下载软件
  17. 所谓领导力,指的是这21种能力
  18. uniapp选中多张图片或者视频(多图上传)
  19. 【机器学习实战】美国波斯顿房价预测
  20. php riak,Riak的分布式数据库模型 - 分布式数据库相关理论 Part3

热门文章

  1. vim末行模式下的替换操作
  2. 开发人员如何在面试中介绍自己的项目经历
  3. 如何删除tmp计算机桌面,win10系统下tmp临时文件删除不了如何解决
  4. 软件自动化测试框架STAF
  5. 【超快捷】Windows系统自带的快捷键合集
  6. ACM比赛中如何加速c++的输入输出
  7. #!/bin/bash和#!/bin/sh是什么意思以及区别
  8. github的Whoa there!问题
  9. B. Restore Modulo
  10. 【Applied Algebra】可满足性模理论(Satisfiability Modulo Theories)入门