React简易版老虎机

栏目: 服务器 · 发布时间: 7年前

内容简介:一直很忙很少有空写点东西,难得闲下来,还是记录下作为怀念。关于React看过文档,很多东西还在摸索中。没想到来到掘金的第一篇文章既然是关于React的,觉得不错的点个赞,哪里需要改进还望各路大大指点!。实际中至少要注意到以下几点:2、点击开始获得停下的位置,需要重置的当前状态。实际中要:从接口获取礼物id,根据id获得对应礼物和要停下的位置(1-18)。其实点击开始的时候就知道获得哪个礼物了~

一直很忙很少有空写点东西,难得闲下来,还是记录下作为怀念。关于React看过文档,很多东西还在摸索中。没想到来到掘金的第一篇文章既然是关于React的,觉得不错的点个赞,哪里需要改进还望各路大大指点!。

附录

一、读前思考,如下图换做你需要考虑哪些地方?

React简易版老虎机

实际中至少要注意到以下几点:

  • 1、用户是否有资格参与?(抽奖剩余次数,是否绑定手机号,实名认证等...)

  • 2、点击开始启动转盘,同时要做到几点:

    • 1):禁止用户再次再次点击开始按钮
    • 2):剩余次数要减少一次
    • 3):动画要由快到慢的缓慢去执行
  • 3、何时停下?(由接口控制如:礼物id),既然由接口控制又会出现:

    • 1):接口正确返回礼物id在客户端礼物列表中存在,正常逻辑
    • 2):接口正确返回但是礼物id在客户端列表中不存在
    • 2):接口超时
    • 3):接口返回错误
  • 4、如果没有抽奖限制(只要有次数就能抽奖),至于是先从接口拿要停下的结果还是一边启动转盘同时去拿结果,根据实际应用中适当处理

  • 5、转盘停止需要一个弹框告诉用户中了什么

  • 6、转盘未停止再次点击需要给用户提示信息

  • 7、如果没资格(没次数,没认证...)也需要给用户提示信息

二、简单分析:这里只展示部分代码

  • 1、初始化组件状态和部分参数,React中是当前组件的状态(state)变化就会触发render重新渲染组件
constructor(props) {
        super(props)
        this.state = {
            giftList: getGift(),
            // 一圈的总长度,礼物总数量
            stepCount: getGift().length,
            // 剩余抽奖次数,接口返回
            myCount: 5,
            // 转动激活位置默认:1,动态,可设置(>=1&&<=stepCount)
            activeIndex: 1,//这里从1开始对应数组的下标0
            // 最终要停下的位置:接口返回(>=1&&<=stepCount)
            endStopIndex: 14,
            // 抽奖是否正在进行中
            isDrawing: false,
            // 转速   分别为最后0,1,2,3,4,5圈的转速
            speed: [336, 168, 84, 42, 42, 42],
            // 抽獎結果的禮物名字
            showDialog: false,
            gotGift: null,
            // 消息提示框
            message: null,
            messageType: null,
            animationName: null,
        };
        // 开启转盘的定时器
        this.timer = null;
        //alert message list
        this.messageInfo = {
            success: {
                message: "恭喜您中奖了!",
                //提示消息的进场动画
                animationName: null
            },
            warning: {
                message: "抽奖进行中,请稍后再试!",
                animationName: "slideInLeft"
            },
            error: {
                message: "抽奖次数不足,抓紧去完成任务获得抽奖资格吧~",
                animationName: "shake",
            },
        }
    }

复制代码

2、点击开始获得停下的位置,需要重置的当前状态。实际中要:从接口获取礼物id,根据id获得对应礼物和要停下的位置(1-18)。其实点击开始的时候就知道获得哪个礼物了~

let {endStopIndex} = 17;
    let myCount = this.state.myCount - 1;
    // 开启转盘,当前抽奖状态设置为true正在抽奖中,并准备启动动画:startRun
    this.setState({isDrawing: true, endStopIndex, myCount}, this.startRun);
    
复制代码

3、准备转动,调用只移动一步的方法

startRun() {
        // 总共需要转的圈数
        let leftRound = this.state.speed.length - 1;
        this.addOneStep({isContinue: true, leftRound})
    }

复制代码

4、移动一步的同时需要重置选中状态,那如何再移动一步?定时器递归调用该移动一步的方法,注意参数变化(特别是如何让动画由快缓慢的变慢),当最后一圈的时候在停在要停的位置。最主要的一部分!

/*
    * 每次增加一步,满一圈,总圈数-1同时速度变慢,直到最后一圈停在指定位置
    * 直到知道结果,慢慢变慢速度,停在结果那;
    * 转盘停到结果值时,重置初始值({isDrawing:false});
    * 
    * Function addOneStep
    * 奖品位置移动一步
    * @isContinue   {Booleans}  是否应该继续这个定时器
    * @leftRound        {Number}    剩余几圈  3代表一个无限大的值,因为还不知道结果
    */
    addOneStep = (params) => {
        let {activeIndex, stepCount, speed} = this.state;
        let {isContinue, leftRound} = params;
        activeIndex += 1;
        if (isContinue) {
            // 如果到超过奖品个数,重置为1
            if (activeIndex > stepCount) {
                console.log(`转了${leftRound}圈`);
                // 圈数减少的同时转动的速度要变慢!!!!!!
                leftRound -= 1;
                activeIndex = 1;
            }
            // 如果已经到最后一圈了  且  已经到了指定要中奖的位置了  就不需要继续了
            if (leftRound === 0 && activeIndex === this.state.endStopIndex) {
                console.log(`現在停在:${this.state.endStopIndex}`);
                isContinue = false;
            }
            this.setState({activeIndex});
            const nextParams = {
                isContinue,
                leftRound,
            };
            this.timer = setTimeout(() => {
                this.addOneStep(nextParams)
            }, speed[leftRound]);//下一次移动的一步的速度
        } else {
            clearTimeout(this.timer);
            this.timer = null;
            let gotGift = this.state.giftList[this.state.endStopIndex - 1];
            this.setState({
                isDrawing: false,
                gotGift,
                showDialog: true,
            });
            this.alertMessage("success")
        }
    }

复制代码

5、停下之后抽奖结束,弹框获得提示信息告诉用户中了什么!

三、提示

  • 1、有些地方根据实际应用中变化,如礼物个数,开始的位置,转动速度,转动圈数等
  • 2、鄙人最开始写的时候动画由快变慢非常明显,经高人指点,得出这个有快变慢的缓动效果
  • 3、DEMO中用了某直播平台的礼物图片如有不适请告知。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Agile Web Development with Rails, Third Edition

Agile Web Development with Rails, Third Edition

Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2009-03-17 / USD 43.95

Rails just keeps on changing. Rails 2, released in 2008, brings hundreds of improvements, including new support for RESTful applications, new generator options, and so on. And, as importantly, we’ve a......一起来看看 《Agile Web Development with Rails, Third Edition》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换