ReactNative短信验证码倒计时控件的实现代码


Posted in Javascript onJuly 20, 2017

由于最近刚开始认真的搞RN,可能有一些封装的不是最佳实践,还是希望大家多提意见,和大家一起进步吧。本文介绍了ReactNative短信验证码倒计时控件,分享给大家

功能

根据项目的需要,需要写一个自定义的控件,实现如下功能:

  1. 默认文字为点击获取验证码
  2. 点击后出现60秒的倒计时
  3. 颜色,字号可调
  4. 倒计时过程中,再次点击需要忽略掉
  5. 倒计时完成后文本恢复成点击获取验证码
  6. 再几次点击同之前

其实说了这么多,就是个最普通的验证码的功能。。。

效果

效果图如下:(录的图片比较一般,对付着看吧)

ReactNative短信验证码倒计时控件的实现代码

实现原理

自己封装了个控件,它内部含有一个Text控件,然后我们又写了一个timer,然后负责倒计时,然后每次都需要判断一下是否继续,然后加了一个flag字段,判断是否接受下次点击事件,当倒计时结束之后还需要将初始状态重置回去即可。

代码

控件代码

import React, {Component } from 'react';
import {
  StyleSheet,
  Text,
  View,
  Image,
  TextInput,
  TouchableHighlight,
  StatusBar,
  Alert,
  AppRegistry
} from 'react-native';
import LinkRow from '../components/LinkRow';
import cStyles from '../styles/CommonStyle';

import axios from 'axios';

class MyCountTime extends Component {
  constructor(props) {
    super(props);
    let timeLeft = this.props.timeLeft > 0 ? this.props.timeLeft : 5;
    let width = this.props.width || 100;
    let height = this.props.height || 50;
    let color = this.props.color || '#42A5F5';
    let fontSize = this.props.fontSize || 30;
    let fontWeight = this.props.fontWeight || '600';
    let borderColor = this.props.borderColor || '#42A5F5';
    let borderWidth = this.props.borderWidth || 1;
    let borderRadius = this.props.borderRadius || 4;
    let backgroundColor = this.props.backgroundColor || '#42A5F5';
    let begin = 0;
    let press = this.props.press;

    this.afterEnd = this.props.afterEnd || this._afterEnd;
    this.style = this.props.style;

    this.state = {
      timeLeft: timeLeft,
      begin: begin
    };
    this.countTextStyle = {
      textAlign: 'center',
      color: '#42A5F5',
      fontSize: fontSize,
      fontWeight: fontWeight

    };
    this.countViewStyle = {
      backgroundColor: backgroundColor,
      alignItems: 'center',
      borderColor: borderColor,
      borderWidth: borderWidth,
      borderRadius: borderRadius,
      width: width,
      height: height
    }
  }

  countdownfn(timeLeft, callback, begin) {
    if (timeLeft > 0) {
      this.state.begin = 1;
      console.log("===lin===>");

      let that = this;
      let interval = setInterval(function () {
        if (that.state.timeLeft < 1) {
          clearInterval(interval);
          callback(that)
        } else {
          let totalTime = that.state.timeLeft;
          that.setState({
            timeLeft: totalTime - 1
          })
        }
      }, 1000)
    }
  }

  _beginCountDown() {
    if (this.state.begin === 1){
      return;
    }
    let time = this.state.timeLeft;
    console.log("===lin===> time " + time);
    let afterEnd = this.afterEnd;
    let begin = this.state.begin;
    console.log("===lin===> start " + begin);
    this.countdownfn(time, afterEnd, begin)
  }

  _afterEnd(that) {
    console.log('------------time over');
    that.setState({
      begin : 0,
      timeLeft : 5,
    })
  }

  componentDidMount() {

  }

  render() {
    return (
      <View style={{position:'absolute',top:13,right:43,height:30}}>
        <Text
          onPress={this._beginCountDown.bind(this)}
          style={{color: '#42A5F5', fontSize: 17,height:40 , zIndex:999}}> { this.state.begin === 0 ? '点击获取验证码' : this.state.timeLeft} </Text>

      </View>
    )
  }
}

应用代码

<MyCountTime timeLeft={5}>

</MyCountTime>

当然这只是,最简单的应用的代码,我们还提供了很多的自定义的属性,大家可以根据自己项目的需要,去调节这些参数。

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

Javascript 相关文章推荐
[原创]站长必须要知道的javascript广告代码
May 30 Javascript
JS的反射问题
Apr 07 Javascript
prettify 代码高亮着色器google出品
Dec 28 Javascript
文本框根据输入内容自适应高度的代码
Oct 24 Javascript
js中return false(阻止)的用法
Aug 14 Javascript
jquery如何判断表格同一列不同行input数据是否重复
May 14 Javascript
javascript修改图片src的方法
Jan 27 Javascript
删除javascript所创建子节点的方法
May 21 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
Jun 13 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
Sep 04 Javascript
javascript cookie基础应用之记录用户名的方法
Sep 20 Javascript
BootStrap Datetimepicker 汉化的实现代码
Feb 10 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
Jul 20 #jQuery
详解Angular CLI + Electron 开发环境搭建
Jul 20 #Javascript
JavaScript 基础表单验证示例(纯Js实现)
Jul 20 #Javascript
js 事件的传播机制(实例讲解)
Jul 20 #Javascript
详谈for循环里面的break和continue语句
Jul 20 #Javascript
js is_valid_filename验证文件名的函数
Jul 19 #Javascript
vue Render中slots的使用的实例代码
Jul 19 #Javascript
You might like
解析PHP的session过期设置
2013/06/29 PHP
php判断数组元素中是否存在某个字符串的方法
2014/06/14 PHP
PHP实现通过URL提取根域名
2016/03/31 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
细品javascript 寻址,闭包,对象模型和相关问题
2009/04/27 Javascript
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
2013/04/23 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
几行js代码实现自适应
2017/02/24 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
Nuxt.js实战详解
2018/01/18 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
2019/05/20 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
JS实现多选框的操作
2020/06/24 Javascript
在类Unix系统上开始Python3编程入门
2015/08/20 Python
python实现烟花小程序
2019/01/30 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
Django RBAC权限管理设计过程详解
2019/08/06 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
C#和SQL Server的面试题
2016/08/12 面试题
英语分层教学实施方案
2014/06/15 职场文书
会计工作岗位职责
2015/02/03 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
MySQL索引是啥?不懂就问
2021/07/21 MySQL
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL