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 相关文章推荐
JavaScript isArray()函数判断对象类型的种种方法
Oct 11 Javascript
jquery Moblie入门—hello world的示例代码学习
Jan 08 Javascript
表单验证的完整应用案例探讨
Mar 29 Javascript
在javascript中如何得到中英文混合字符串的长度
Jan 17 Javascript
iframe实用操作锦集
Apr 22 Javascript
改变checkbox默认选中状态及取值的实现代码
May 26 Javascript
JS实现HTML表格排序功能
Aug 05 Javascript
jQuery实现三级联动效果
Mar 02 Javascript
原生JS实现不断变化的标签
May 22 Javascript
使用 Node.js 对文本内容分词和关键词抽取
May 27 Javascript
Nuxt.js之自动路由原理的实现方法
Nov 21 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
Dec 06 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扩展图文教程
2008/12/12 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
2017/03/04 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
python3.x上post发送json数据
2018/03/04 Python
python去除文件中重复的行实例
2018/06/29 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
小学生感恩演讲稿
2014/04/25 职场文书
会计专业自荐信
2014/06/03 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
win10键盘驱动怎么修复?Win10键盘驱动修复小技巧
2022/04/06 数码科技
box-shadow单边阴影的实现
2023/05/21 HTML / CSS