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弹出层包含flash 不能关闭隐藏的2种处理方法
Jun 17 Javascript
JS的document.all函数使用示例
Dec 30 Javascript
用于deeplink的js方法(判断手机是否安装app)
Apr 02 Javascript
Javascript 实现复制(Copy)动作方法大全
Jun 20 Javascript
JsRender for object语法简介
Oct 31 Javascript
javascript实现图片跟随鼠标移动效果的方法
May 13 Javascript
Javascript函数的参数
Jul 16 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
Jun 09 Javascript
JavaScript 中调用 Kotlin 方法实例详解
Jun 09 Javascript
利用node实现一个批量重命名文件的函数
Dec 21 Javascript
layui按条件隐藏表格列的实例
Sep 19 Javascript
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
基于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表单提交问题的解决方法
2011/04/12 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
2007/02/23 Javascript
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
简单的网页广告特效实例
2017/08/19 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
Unicode和Python的中文处理
2017/03/19 Python
python脚本替换指定行实现步骤
2017/07/11 Python
python实现停车管理系统
2018/11/30 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
教师实习自我鉴定
2013/12/18 职场文书
一年级数学教学反思
2014/02/01 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
2014年中职班主任工作总结
2014/12/16 职场文书
三行辞职书范文
2015/02/26 职场文书
少先队中队工作总结2015
2015/07/23 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript