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 相关文章推荐
js获取事件源及触发该事件的对象
Oct 24 Javascript
Jquery实现自定义弹窗示例
Mar 12 Javascript
js简单的表格添加行和删除行操作示例
Mar 31 Javascript
Jquery中find与each方法用法实例
Feb 04 Javascript
javascript实现一个数值加法函数
Jun 26 Javascript
基于jQuery实现简单的折叠菜单效果
Nov 23 Javascript
JavaScript+CSS无限极分类效果完整实现方法
Dec 22 Javascript
浅谈js基本数据类型和typeof
Aug 09 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
Aug 13 Javascript
vue 的 solt 子组件过滤过程解析
Sep 07 Javascript
JavaScript之Blob对象类型的具体使用方法
Nov 29 Javascript
JS+CSS实现过渡特效
Jan 02 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
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
JS实现局部选择打印和局部不选择打印
2014/04/03 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
jQuery热气球动画半透明背景的后台登录界面代码分享
2015/08/28 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
vue 使用rules对表单字段进行校验的步骤
2020/12/25 Vue.js
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
安装docker-compose的两种最简方法
2019/07/30 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
详解canvas多边形(蜘蛛图)的画法示例
2018/01/29 HTML / CSS
安踏官方商城:anta.cn
2019/12/16 全球购物
英语翻译系毕业生求职信
2013/09/29 职场文书
奠基仪式策划方案
2014/05/15 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
见习报告格式范文
2014/11/08 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书