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 相关文章推荐
DEFER怎么用?
Jul 01 Javascript
一个加密JavaScript的开源工具PACKER2.0.2
Nov 04 Javascript
利用javascript解决图片缩放及其优化的代码
May 23 Javascript
如何在指定的地方插入html内容和文本内容
Dec 23 Javascript
angularjs 处理多个异步请求方法汇总
Jan 06 Javascript
JavaScript控制按钮可用或不可用的方法
Apr 03 Javascript
Bootstrap模态窗口源码解析
Feb 08 Javascript
js遍历获取表格内数据的方法(必看)
Apr 06 Javascript
手把手教你使用vue-cli脚手架(图文解析)
Nov 08 Javascript
jQuery插件jsonview展示json数据
May 26 jQuery
Vue 全局loading组件实例详解
May 29 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
Jun 02 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 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
js资料toString 方法
2007/03/13 Javascript
JavaScript 原型继承
2011/12/26 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
详解Angular6 热加载配置方案
2018/08/18 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
Canvas获取视频第一帧缩略图的实现
2020/11/11 HTML / CSS
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
美术专业学生个人自我评价
2013/09/19 职场文书
学术会议欢迎词
2014/01/09 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
组工干部演讲稿
2014/09/02 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
工作检讨书怎么写
2015/01/23 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技