React注册倒计时功能的实现


Posted in Javascript onSeptember 06, 2018

一、React版本

16.4.1

二、具体代码如下

设置state属性

constructor(props){
    super(props);
    this.state = {
      btnText:'获取验证码',
      seconds: 60, //称数初始化
      liked: true //获取验证码文案
    }
  }

2.倒计时

// 获取验证码
  sendCode = () => {
    let siv = setInterval(() => {
      this.setState({
        liked:false,
        seconds:this.state.seconds - 1,  
      },() => {
        if(this.state.seconds == 0){
          clearInterval(siv);
          this.setState({
            liked:true,
            secounds:60
          })
        }
      });  
    },1000);  
  }

3.jsx代码

<FormItem
       {...formItemLayout}
       label="验证码"
      >
       <Row gutter={8}>
        <Col span={6}>
         {getFieldDecorator('captcha', {
          rules: [{ required: true, message: '请输入短信验证码!' }],
         })(
          <Input />
         )}
        </Col>
        <Col span={12}>
          <Button onClick={this.sendCode} disabled={!this.state.liked}>
          {
            this.state.liked
            ?
             <span>{this.state.btnText}</span>
             :
             <span>{this.state.seconds + ' s 后重新发送'}</span>
          }
          </Button>
        </Col>
       </Row>
      </FormItem>

明明很简单的,但是看网上有的代码搞得很复杂一样,当然也可以用react相关插件,不过我觉得这样更简洁。

ps:react 获取服务器端时间倒计时

import React, { Component } from 'react'
import axios from 'axios'

export default class Timer extends Component {

 constructor(props) {
  super(props)
  this.state = {
   bool: false,
   days: '0',
   hours: '00',
   minutes: '00',
   seconds: '00'
  }
 }

 componentDidMount() {
  this.start()
 }

 async start() {
  this.timer && clearTimeout(this.timer) // 先清除一遍定时器,避免被调用多次
  // 发起任意一个服务器请求, 然后从headers 里获取服务器时间
  let leftTime = await axios.get('/').then(response => {
   return new Date(this.props.date).getTime() - new Date(response.headers.date).getTime() // 服务器与倒计时的 时间差
  }).catch(error => {
   console.log(error)
   return 0 // 这里发送的服务器请求失败 设为0
  })

  // 倒计时
  this.timer = setInterval(() => {
   leftTime = leftTime - 1000
   let { bool, days = '0', hours = '00', minutes = '00', seconds = '00' } = this.countdown(leftTime)
   if (bool) { // 结束倒计时
    clearTimeout(this.timer)
   }
   this.setState({
    bool,
    days,
    hours,
    minutes,
    seconds
   })
  }, 1000)
 }

 /**
  * 倒计时
  * @param leftTime 要倒计时的时间戳
  */
 countdown(leftTime) {
  let bool = false
  if (leftTime <= 0) {
   bool = true
   return { bool }
  }
  var days = parseInt(leftTime / 1000 / 60 / 60 / 24, 10) //计算剩余的天数
  var hours = parseInt(leftTime / 1000 / 60 / 60 % 24, 10)
  if (hours < 10) {
   hours = '0' + hours
  }
  var minutes = parseInt(leftTime / 1000 / 60 % 60, 10)
  if (minutes < 10) {
   minutes = '0' + minutes
  }
  var seconds = parseInt(leftTime / 1000 % 60, 10)
  if (seconds < 10) {
   seconds = '0' + seconds
  }
  return { bool, days, hours, minutes, seconds }
 }

 componentWillUnmount() {
  clearTimeout(this.timer)
 }

 render() {
  let { bool, days, hours, minutes, seconds } = this.state
  return (
   <div>
    {
     bool ?
      <div>活动已结束</div> :
      <div>
       {days} 天 {hours} : {minutes} : {seconds}
      </div>
    }
   </div>
  )
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
Mar 01 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
Dec 11 Javascript
JavaScript调用ajax获取文本文件内容实现代码
Mar 28 Javascript
jQuery验证元素是否为空的两种常用方法
Mar 17 Javascript
jQuery选择器源码解读(一):Sizzle方法
Mar 31 Javascript
JS+CSS实现的蓝色table选项卡效果
Oct 08 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
Apr 18 Javascript
下雪了 javascript实现雪花飞舞
Aug 02 Javascript
浅谈js键盘事件全面控制
Dec 01 Javascript
angularjs使用directive实现分页组件的示例
Feb 07 Javascript
jquery获取transform里的值实现方法
Dec 12 jQuery
纯JS开发baguetteBox.js响应式画廊插件
Jun 28 Javascript
node.js 模块和其下载资源的镜像设置的方法
Sep 06 #Javascript
Vue文件配置全局变量的实例
Sep 06 #Javascript
Vue中保存数据到磁盘文件的方法
Sep 06 #Javascript
jQuery超简单遮罩层实现方法示例
Sep 06 #jQuery
Vue实现表格中对数据进行转换、处理的方法
Sep 06 #Javascript
vue生成文件本地打开查看效果的实例
Sep 06 #Javascript
vuejs实现折叠面板展开收缩动画效果
Sep 06 #Javascript
You might like
用PHP制作静态网站的模板框架(一)
2006/10/09 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
JQuery中上下文选择器实现方法
2015/05/18 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
vue-router 起步步骤详解
2019/03/26 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
2019/10/12 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
python中对list去重的多种方法
2014/09/18 Python
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
Python构建XML树结构的方法示例
2017/06/30 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
Python3.4实现远程控制电脑开关机
2018/02/22 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
葡萄牙语专业个人求职信
2013/12/10 职场文书
学校课外活动总结
2014/05/08 职场文书
安全承诺书格式
2014/05/21 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
Vue2.0搭建脚手架
2022/03/13 Vue.js
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers