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 相关文章推荐
一个加载js文件的小脚本
Jun 28 Javascript
用js遍历 table的脚本
Jul 23 Javascript
javascript实现的简单的表单验证
Jul 10 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
Jul 27 Javascript
Angular 页面跳转时传参问题
Aug 01 Javascript
BootStrap glyphicon图标无法显示的解决方法
Sep 06 Javascript
简单的Vue SSR的示例代码
Jan 12 Javascript
jQuery 防止相同的事件快速重复触发方法
Feb 08 jQuery
VUE-cli3使用 svg-sprite-loader
Oct 20 Javascript
JS实现简单随机3D骰子
Oct 24 Javascript
Js图片点击切换轮播实现代码
Jul 27 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
Dec 04 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实现的功能是显示8条基色色带
2006/10/09 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
php实现的顺序线性表示例
2019/05/04 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
js制作支付倒计时页面
2016/10/21 Javascript
详解ES6中的let命令
2020/04/05 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
Python中变量交换的例子
2014/08/25 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
使用TFRecord存取多个数据案例
2020/02/17 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
农业开发项目建议书
2014/05/16 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
中秋节祝酒词
2015/08/12 职场文书
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript