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 demo 基本技巧
Dec 18 Javascript
原生javascript兼容性测试实例
Jul 01 Javascript
回车直接实现点击某按钮的效果即触发单击事件
Feb 27 Javascript
javascript面向对象特性代码实例
Jun 12 Javascript
tuzhu_req.js 实现仿百度图片首页效果
Aug 11 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
May 20 Javascript
vue实现列表的添加点击
Dec 29 Javascript
jQuery滑动效果实现方法分析
Sep 05 jQuery
Node使用Selenium进行前端自动化操作的代码实现
Oct 10 Javascript
微信小程序wxs实现吸顶效果
Jan 08 Javascript
JavaScript常用工具函数汇总(浏览器环境)
Sep 17 Javascript
jQuery实现推拉门效果
Oct 19 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生成WAP页面
2006/10/09 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
JavaScript 事件查询综合
2009/07/13 Javascript
JS 的应用开发初探(mootools)
2009/12/19 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
JavaScript实现全选取消效果
2017/12/14 Javascript
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
用Python实现职工信息管理系统
2020/12/30 Python
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
Python是如何进行类型转换的
2013/06/09 面试题
外贸学院会计专业应届生求职信
2013/11/14 职场文书
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
家教广告词
2014/03/19 职场文书
副科级后备干部考察材料
2014/05/15 职场文书
食品安全标语
2014/06/07 职场文书
空气的环保标语
2014/06/12 职场文书
党性教育心得体会
2014/09/03 职场文书
2014最新党员违纪检讨书
2014/10/12 职场文书
群众路线党员个人整改措施
2014/10/27 职场文书
评先进个人材料
2014/12/29 职场文书
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android