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 相关文章推荐
javascript window.opener的用法分析
Apr 07 Javascript
jQuery内容过滤选择器用法分析
Feb 10 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
Aug 13 Javascript
浅析JavaScript作用域链、执行上下文与闭包
Feb 01 Javascript
AngularJS 所有版本下载地址
Sep 14 Javascript
微信小程序 页面跳转和数据传递实例详解
Jan 19 Javascript
js推箱子小游戏步骤代码解析
Jan 10 Javascript
JS基于封装函数实现的表格分页完整示例
Jun 26 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
Sep 27 Javascript
对vue v-if v-else-if v-else 的简单使用详解
Sep 29 Javascript
JavaScript简单实现的仿微博留言功能示例
Jan 17 Javascript
vue使用element-ui按需引入
May 20 Vue.js
详解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
php更新修改excel中的内容实例代码
2014/02/26 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
用javascript将数据导入Excel示例代码
2014/09/10 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
javascript简易画板开发
2020/04/12 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
Python的Flask框架中web表单的教程
2015/04/20 Python
详解Python文本操作相关模块
2017/06/22 Python
python实现数据图表
2017/07/29 Python
python如何将图片转换为字符图片
2020/08/19 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
python对csv文件追加写入列的方法
2019/08/01 Python
python3实现弹弹球小游戏
2019/11/25 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
Python基于callable函数检测对象是否可被调用
2020/10/16 Python
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
智能钱包:Ekster
2019/11/21 全球购物
程序员机试试题汇总
2012/03/07 面试题
大学生自我评价怎样写好
2013/10/23 职场文书
热能动力工程毕业生自荐信
2013/11/07 职场文书
食品营养与检测应届生求职信
2013/11/08 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
药品采购员岗位职责
2014/02/08 职场文书
供应链金融服务方案
2014/05/25 职场文书
行政前台岗位职责
2015/04/16 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android