React Native验证码倒计时工具类分享


Posted in Javascript onOctober 24, 2017

本文实例为大家分享了React Native验证码倒计时工具类的具体代码,供大家参考,具体内容如下

因为以前直接用定时器,没去计算当前的时候,每次退出程序的时候,定时器一直不走,这个工具类简单的解决程序退出后台,定时器不走的bug,那么,直接上代码咯~~

/**
 * Created by zhuang.haipeng on 2017.9.11
 *
 * 广告倒计时,验证码倒计时工具类
 *
 * 用法: //60 * 1000 为60秒 , 60 * 60 * 100 为60分钟 ...
 * let countdownDate = new Date(new Date().getTime() + 60 * 1000)
 *  CountdownUtil.settimer(countdownDate, (time) => {
 *   Console.log(time) --> {years: 0, days: 0, hours: 0, min: 0, sec: 49, millisec: 0}
 *  }
 *
 *  切记: 在应用工具类的页面退出的时候, 调用CountdownUtil.stop() 清除定时器,以免内存爆了
 */

export default class CountdownUtil {

  /** 定时器 */
  interval = null;

  /**
   * 创建定时器
   *
   */
  static settimer(countdownDate, callbak) {
    this.interval = setInterval(() => {
      let time = this.getDateData(countdownDate)
      callbak && callbak(time)
    }, 1000)
  }


  /**
   * 侄计时计算 --> 通过此方法计算,可以解决应用退出后台的时候,定时器不走
   * @param countdownDate
   * @return {*}
   */
  static getDateData(countdownDate) {
    let diff = (Date.parse(new Date(countdownDate)) - Date.parse(new Date)) / 1000;

    if (diff <= 0) {
     this.stop() // 倒计时为0的时候, 将计时器清除
      return 0;
    }

    const timeLeft = {
      years: 0,
      days: 0,
      hours: 0,
      min: 0,
      sec: 0,
      millisec: 0,
    };

    if (diff >= (365.25 * 86400)) {
      timeLeft.years = Math.floor(diff / (365.25 * 86400));
      diff -= timeLeft.years * 365.25 * 86400;
    }
    if (diff >= 86400) {
      timeLeft.days = Math.floor(diff / 86400);
      diff -= timeLeft.days * 86400;
    }
    if (diff >= 3600) {
      timeLeft.hours = Math.floor(diff / 3600);
      diff -= timeLeft.hours * 3600;
    }
    if (diff >= 60) {
      timeLeft.min = Math.floor(diff / 60);
      diff -= timeLeft.min * 60;
    }
    timeLeft.sec = diff;
    return timeLeft;
  }

  /**
   * 数字补零 --> 例: 00时01分59秒
   * @param num
   * @param length
   * @return {*}
   */
  static leadingZeros(num, length = null) {

    let length_ = length;
    let num_ = num;
    if (length_ === null) {
      length_ = 2;
    }
    num_ = String(num_);
    while (num_.length < length_) {
      num_ = '0' + num_;
    }
    return num_;
  }

  /** 清除定时器 */
  static stop() {
    clearInterval(this.interval);
  }
};

利用callback将转换的时间倒计时传递出去, 您可以打印一下callbak回去的time对象

这里简单以验证码倒计时为例:

思路:

1. 先设置状态机isSentVerify默认true可以发送验证码
2. 点击之后就重新设置状态机isSentVerify为false, 不让用户再次点击发送网络请求
3. 声明倒计时的时间(这里只能在你点击的时候才能声明,如果再componentDidMount中,会一进入就开始计时的)
4. 请求成功后设置倒计时,判断如果time.sec > 0 的时候,则设置时间,否则将文字设置为为“重新获取”
5. 然后判断文字为“重新获取”, 然后将状态机isSentVerify设为true, 这样用户倒计时结束后,可以再次发送验证码。
6. 网络请求失败的时候,在catch处将isSentVerify设置为true,这样用户可以再次获取验证码

if (this.state.isSentVerify === true) {
      // 倒计时时间
      let countdownDate = new Date(new Date().getTime() + 60 * 1000)
      // 点击之后验证码不能发送网络请求
      this.setState({
        isSentVerify: false
      });

      Api.userRegisterCheckCode(this.state.phoneText)
        .then(
          (data) => { // 倒计时时间
            CountdownUtil.settimer(countdownDate, (time) => {
              this.setState({
                timerTitle: time.sec > 0 ? time.sec + 's' : '重新获取'
              }, () => {
                if (this.state.timerTitle == "重新获取") {
                  this.setState({
                    isSentVerify: true
                  })
                }
              })
            })
          }
        ).catch((err) => {
        this.setState({
          isSentVerify: true,
        })
      });
    }

退出页面的时候,记得销毁定时器

componentWillUnmount() {
    CountdownUtil.stop()
  }

效果图:

React Native验证码倒计时工具类分享

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
Mar 05 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
Feb 22 Javascript
JavaScript面向对象编程入门教程
Apr 16 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
Sep 01 Javascript
彻底学会Angular.js中的transclusion
Mar 12 Javascript
js实现水平滚动菜单导航
Jul 21 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
Aug 26 jQuery
Easy UI动态树点击文字实现展开关闭功能
Sep 30 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 Javascript
在Vue中实现随hash改变响应菜单高亮
Mar 09 Javascript
Vue如何基于es6导入外部js文件
May 15 Javascript
JavaScript原始值与包装对象的详细介绍
May 11 Javascript
详解vue + vuex + directives实现权限按钮的思路
Oct 24 #Javascript
React Native实现地址挑选器功能
Oct 24 #Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
Oct 24 #Javascript
React Native 通告消息竖向轮播组件的封装
Aug 25 #Javascript
Vue v2.5 调整和更新不完全问题
Oct 24 #Javascript
Vue.js 2.5新特性介绍(推荐)
Oct 24 #Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
Oct 24 #Javascript
You might like
2020最新CPU的性能排名
2020/04/02 数码科技
基于php伪静态的实现详细介绍
2013/04/28 PHP
PHP生成短网址方法汇总
2016/07/12 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
javascript 操作文件 实现方法小结
2009/07/02 Javascript
js控制页面控件隐藏显示的两种方法介绍
2013/10/09 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
python实现windows下文件备份脚本
2018/05/27 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
pandas 对group进行聚合的例子
2019/12/27 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
python selenium xpath定位操作
2020/09/01 Python
python lambda的使用详解
2021/02/26 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
技校生自我鉴定范文
2013/09/26 职场文书
大学生创业策划书
2014/02/02 职场文书
英文求职信写作小建议
2014/02/16 职场文书
企业新年寄语
2014/04/04 职场文书
教师年度考核评语
2014/04/28 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
美术教师求职信范文
2015/03/20 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书