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
JQuery弹出层示例可自定义
May 19 Javascript
node.js中的Socket.IO使用实例
Nov 04 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
Aug 04 Javascript
jQuery添加options点击事件并传值实例代码
May 18 Javascript
vue监听滚动事件实现滚动监听
Apr 11 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
js/jQuery实现全选效果
Jun 17 jQuery
JavaScript中callee和caller的区别与用法实例分析
Jun 28 Javascript
vue+elementUI实现图片上传功能
Aug 20 Javascript
微信小程序仿通讯录功能
Apr 09 Javascript
Javascript如何递归遍历本地文件夹
Aug 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
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
构建简单的Webmail系统
2006/10/09 PHP
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
深入分析JSON编码格式提交表单数据
2015/06/25 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
Nuxt使用Vuex的方法示例
2019/09/06 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
2019/09/26 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
js实现跳一跳小游戏
2020/07/31 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
js实现碰撞检测
2021/01/29 Javascript
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
python实现随机梯度下降(SGD)
2020/03/24 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
django session完成状态保持的方法
2018/11/27 Python
基于python实现KNN分类算法
2020/04/23 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
基于Python fminunc 的替代方法
2020/02/29 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
轻松制作精彩视频:Animoto
2018/09/19 全球购物
2014年廉洁自律承诺书
2014/05/26 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
女方离婚起诉书
2015/05/18 职场文书
部分武汉产收音机展览
2022/04/07 无线电