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 相关文章推荐
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
Feb 03 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
Mar 01 Javascript
js遍历、动态的添加数据的小例子
Jun 22 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 Javascript
jQuery通过扩展实现抖动效果的方法
Mar 11 Javascript
jquery点击缩略图切换视频播放特效代码分享
Sep 15 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
Dec 04 Javascript
微信小程序 向左滑动删除功能的实现
Mar 10 Javascript
Vue实现动态显示textarea剩余字数
May 22 Javascript
微信小程序实现移动端滑动分页效果(ajax)
Jun 13 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
Oct 28 jQuery
JS实现按比例缩小图片宽高
Aug 24 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多重接口的实现方法
2015/06/20 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
JSON 教程 json入门学习笔记
2020/09/22 Javascript
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
使用js dom和jquery分别实现简单增删改
2014/09/11 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
Python中一个for循环循环多个变量的示例
2019/07/16 Python
Django实现发送邮件功能
2019/07/18 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
keras处理欠拟合和过拟合的实例讲解
2020/05/25 Python
Python接口自动化测试的实现
2020/08/28 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
中学生评语大全
2014/04/18 职场文书
公司领导班子对照材料
2014/08/18 职场文书
2014年效能监察工作总结
2014/11/21 职场文书
好段摘抄大全(48句)
2019/08/08 职场文书