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 相关文章推荐
javascript flash下fromCharCode和charCodeAt方法使用说明
Jan 12 Javascript
js+xml生成级联下拉框代码
Jul 24 Javascript
js动态改变select选择变更option的index值示例
Jul 10 Javascript
js中for in语句的用法讲解
Apr 24 Javascript
JS模式之单例模式基本用法
Jun 30 Javascript
用javascript实现自动输出网页文本
Jul 30 Javascript
JavaScript实现网页加载进度条代码超简单
Sep 21 Javascript
Javascript函数式编程语言
Oct 11 Javascript
浅谈js里面的InttoStr和StrtoInt
Jun 14 Javascript
详解angular element()方法使用
Apr 08 Javascript
Vue 子组件与数据传递问题及注意事项
Jul 11 Javascript
微信小程序按钮点击动画效果的实现
Sep 04 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获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
canvas绘制七巧板
2017/02/03 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
Vue实现用户自定义字段显示数据的方法
2018/08/28 Javascript
深入理解 JS 垃圾回收
2019/06/03 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
Python读写Redis数据库操作示例
2014/03/18 Python
python字典基本操作实例分析
2015/07/11 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
Python matplotlib画图与中文设置操作实例分析
2019/04/23 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
HTML5之HTML元素扩展(上)—新增加的元素及使用概述
2013/01/31 HTML / CSS
财务总监管理岗位职责
2014/03/08 职场文书
解除劳动合同协议书
2014/04/14 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python