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 相关文章推荐
网上应用的一个不错common.js脚本
Aug 08 Javascript
JavaScript 事件系统
Jul 22 Javascript
图片onload事件触发问题解决方法
Jul 31 Javascript
js使用DOM操作实现简单留言板的方法
Apr 10 Javascript
javascript模拟评分控件实现方法
May 13 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
Jul 27 Javascript
RequireJS用法简单示例
Aug 20 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
Sep 26 Javascript
微信小程序开发的基本流程步骤
Jan 31 Javascript
详解jquery和vue对比
Apr 16 jQuery
微信小程序实现树莓派(raspberry pi)小车控制
Feb 12 Javascript
JS实现横向跑马灯效果代码
Apr 20 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
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
PHP网站基础优化方法小结
2008/09/29 PHP
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
2020/12/24 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
使用Typescript和ES模块发布Node模块的方法
2020/05/25 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
javascript实现扫雷简易版
2020/08/18 Javascript
python安装教程 Pycharm安装详细教程
2017/05/02 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
python 切换root 执行命令的方法
2019/01/19 Python
pygame实现打字游戏
2021/02/19 Python
python itsdangerous模块的具体使用方法
2020/02/17 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
运行python提示no module named sklearn的解决方法
2020/11/29 Python
html5弹跳球示例代码
2013/07/23 HTML / CSS
通用求职信范文模板分享
2013/12/27 职场文书
关于打架的检讨书
2014/01/17 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
三八妇女节标语
2014/10/09 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
小学三年级作文之写景
2019/11/05 职场文书
导游词之清晏园
2019/11/22 职场文书