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 相关文章推荐
短信提示使用 特效
Jan 19 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
Jan 09 Javascript
ExtJS4中使用mixins实现多继承示例
Dec 03 Javascript
jquery判断浏览器后退时候弹出消息的方法
Aug 11 Javascript
jQuery中:eq()选择器用法实例
Dec 29 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
Oct 26 Javascript
JavaScript事件学习小结(三)js事件对象
Jun 09 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
Nov 24 Javascript
React中的render何时执行过程
Apr 13 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
Sep 30 Javascript
浅谈Node 异步IO和事件循环
May 05 Javascript
vue实现日历备忘录功能
Sep 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/05/12 PHP
js tab 选项卡
2009/04/26 Javascript
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
JavaScript对数字的判断与处理实例分析
2015/02/02 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
2020/04/21 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
Vue实现小购物车功能
2020/12/21 Vue.js
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python 实现归并排序算法
2012/06/05 Python
详解Python中的__new__()方法的使用
2015/04/09 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
详解python while 函数及while和for的区别
2018/09/07 Python
django实现支付宝支付实例讲解
2019/10/17 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
北承题目(C++)
2012/05/16 面试题
人事行政主管岗位职责
2013/12/22 职场文书
土建资料员岗位职责
2014/01/04 职场文书
学校食品安全实施方案
2014/06/14 职场文书
大学生感恩父母演讲稿
2014/08/28 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
论语读书笔记
2015/06/26 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python