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 相关文章推荐
jQuery 使用手册(一)
Sep 23 Javascript
BOM与DOM的区别分析
Oct 26 Javascript
解析jquery中的ajax缓存问题
Dec 19 Javascript
window.onerror()的用法与实例分析
Jan 27 Javascript
Javascript 基础---Ajax入门必看
Jul 06 Javascript
jQuery simpleModal插件的使用介绍
Aug 30 Javascript
基于easyui checkbox 的一些操作处理方法
Jul 10 Javascript
在ABP框架中使用BootstrapTable组件的方法
Jul 31 Javascript
vue.js声明式渲染和条件与循环基础知识
Jul 31 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
Sep 20 Javascript
JS如何把字符串转换成json
Feb 21 Javascript
JavaScript实时更新当前的时间的示例代码
Jul 15 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
hessian 在PHP中的使用介绍
2010/12/13 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
深入理解Javascript中的this关键字
2015/03/27 Python
轻松掌握python设计模式之策略模式
2016/11/18 Python
使用C++扩展Python的功能详解
2018/01/12 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
PHP实现发送和接收JSON请求
2018/06/07 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
Python Grid使用和布局详解
2018/06/30 Python
Sanic框架配置操作分析
2018/07/17 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
python设置表格边框的具体方法
2020/07/17 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
美国眼镜网站:LensCrafters
2020/01/19 全球购物
司机岗位职责
2013/11/15 职场文书
优秀应届毕业生自荐信
2013/11/16 职场文书
财务信息服务专业自荐书范文
2014/02/08 职场文书
《蚂蚁和蝈蝈》教学反思
2014/02/24 职场文书
大学生工作自荐书
2014/06/16 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
工资证明范本
2015/06/12 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android