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 相关文章推荐
兼容所有浏览器的js复制插件Zero使用介绍
Mar 19 Javascript
JavaScript中的原型链prototype介绍
Dec 30 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
Jul 01 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
Dec 19 Javascript
Node学习记录之cluster模块
May 31 Javascript
mac上node.js环境的安装测试
Jul 03 Javascript
浅谈React + Webpack 构建打包优化
Jan 23 Javascript
快速搭建vue2.0+boostrap项目的方法
Apr 09 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
Sep 29 Javascript
快速对接payjq的个人微信支付接口过程解析
Aug 15 Javascript
Vue快速实现通用表单验证的方法
Feb 24 Javascript
vue实现表格合并功能
Dec 01 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的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
Python脚本实现下载合并SAE日志
2015/02/10 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
Python调用C语言程序方法解析
2020/07/07 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
为什么需要版本控制?
2013/08/08 面试题
倡议书格式范文
2014/04/14 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
超市七夕促销活动方案
2014/08/28 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书