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日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
Mar 01 Javascript
JS函数重载的解决方案
May 13 Javascript
实现音乐播放器的代码(html5+css3+jquery)
Aug 04 Javascript
js实现具有高亮显示效果的多级菜单代码
Sep 01 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
May 09 Javascript
学习Javascript闭包(Closure)知识
Aug 07 Javascript
JavaScript中自带的 reduce()方法使用示例详解
Aug 10 Javascript
jquery.picsign图片标注组件实例详解
Feb 02 jQuery
Vue.js 中的 v-model 指令及绑定表单元素的方法
Dec 03 Javascript
node全局变量__dirname与__filename的区别
Jan 14 Javascript
微信小程序顶部导航栏滑动tab效果
Jan 28 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
May 29 jQuery
基于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图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
laravel学习教程之存取器
2016/07/30 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
php 可变函数使用小结
2018/06/12 PHP
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
2016/06/18 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
Python写的Discuz7.2版faq.php注入漏洞工具
2014/08/06 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
python黑魔法之编码转换
2016/01/25 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
Python中functools模块的常用函数解析
2016/06/30 Python
安装python及pycharm的教程图解
2019/10/10 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
浅析python 字典嵌套
2020/09/29 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
美丽的现代设计家具:2Modern
2018/07/26 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
外贸会计专业自荐信
2014/06/22 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书