java 9宫格抽奖_js 实现9宫格抽奖(react)
最近工作中有个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?
: ""
}
} 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)相关推荐
- php9宫格抽奖程序_使用php控制抽奖系统
一下观点都是小弟未经深思熟虑的考虑写的,如果不对的地方请指点.... 抽奖系统 俗称 大转盘 或 九宫格抽奖功能,大转盘或九宫格的功能我就不说了,网上插件有很多,也很简单,这里就简单的讲解一下思路 1 ...
- java写入excel文件,并填充空单元格颜色
java写excel文件,并填充空单元格颜色 public static void main(String[] args) throws IOException {HSSFWorkbook workb ...
- java使用poi生成Excel文件并合并单元格
java使用poi生成Excel文件并合并单元格 业务需要根据 分管部门 字段进行合并,现在提供一种思路. controller层 @Inject(target = "/inf ...
- java excel单元格背景色_POI 设置Excel单元格背景色(setFillForegroundColor)
背景介绍: 使用Java开发信息系统项目,项目中往往会涉及到报表管理部分,而Excel表格首当其冲称为最合适的选择,但是对单元格操作时对于设置单元格的背景颜色却很少提及,本文旨在方便单元格背景颜色设计 ...
- java实现计算器的退格功能_帮忙看下这个java做的计算器为什么实现不了退格和清零功能,3q...
已结贴√ 问题点数:5 回复次数:1 帮忙看下这个java做的计算器为什么实现不了退格和清零功能,3q import java.awt.*; import java.awt.event.*; publ ...
- java表格里面显示图片_jquery表格datagrid单元格显示图片及分页使用
要想达到自定义显示表格框的目的比如显示图片,超链接,按钮的形式,只需要给列添加formatter属性即可,比如显示图片: columns: [[ { field: 'IName', title: '显 ...
- java 抽奖_java抽奖工具类:按概率抽奖
在一些抽奖活动中,会有按概率抽取奖品的操作,本文将提供一个抽奖概率的解决方案. 假设抽奖集合如下: 奖品id 概率 1 10% 2 10% 3 20% 4 20% 生成集合 生成的连续集合为{(0.0 ...
- cxgrid中纵横单元格合并_被合并单元格折磨疯的我,真后悔没早点知道这个Excel技巧!...
在大家日常的工作中,经常会用到Excel合并单元格,然而合并单元格其实只是美化了表格,它会使我们后续的统计工作遇到很多麻烦,今天就给大家提供两个解决这个问题的思路. 01 合并单元格的基本操作方法 在 ...
- vba字典合并单元格为空_VBA合并单元格求和处理套路
在Excel中,合并单元格的使用会带来相当令人不爽的麻烦.但其使用率还是蛮高的. 如图,需要对部门的销售额做总计. Sub 樱桃小丸子() Dim arr, d As Object, i&, ...
最新文章
- jquery设置属性值或移除属性
- buu [BJDCTF 2nd]Y1nglish-y1ng
- C++ 流操作符重载函数
- 前端入门11-JavaScript语法之数组
- Linux_CentOS-服务器搭建 六
- [BZOJ1477] 青蛙的约会|扩展欧几里得算法
- C语言宏定义,内置宏的用法
- 学生选课系统项目分析-1,架构
- 基于偏微分方程的图像分割(二)Snake模型 Matlab实现
- 小型oa服务器系统,大型、中小型企业OA系统实施差异对比
- Android开发技巧 (四) —— 多窗口模式
- C语言书籍阅读-读书笔记--《C专家编程》
- Spring数据绑定之DataBinder篇---01
- CodeForces - 1467C(枚举,思维)
- Uniformly Distributed
- Tixati——BT下载软件
- 所谓领导力,指的是这21种能力
- uniapp选中多张图片或者视频(多图上传)
- 【机器学习实战】美国波斯顿房价预测
- php riak,Riak的分布式数据库模型 - 分布式数据库相关理论 Part3
热门文章
- vim末行模式下的替换操作
- 开发人员如何在面试中介绍自己的项目经历
- 如何删除tmp计算机桌面,win10系统下tmp临时文件删除不了如何解决
- 软件自动化测试框架STAF
- 【超快捷】Windows系统自带的快捷键合集
- ACM比赛中如何加速c++的输入输出
- #!/bin/bash和#!/bin/sh是什么意思以及区别
- github的Whoa there!问题
- B. Restore Modulo
- 【Applied Algebra】可满足性模理论(Satisfiability Modulo Theories)入门