目前很多的网站和app在做登陆注册时都会用到手机验证码,为了防止验证码轰炸,也就是随意的点击验证码,一般我们需要对获取验证码进行一些限制,最常用到的是在规定时间内不得重复发送。

  实现倒计时很简单,可以设置一个计时器,在设置的时间内给获取验证码的按钮添加 disabled=true 属性,可以避免用户重复点击。但是如果用户刷新了页面呢?下面就来记录一下我的解决方案。

  jsx代码

<p>
<i className="iconfont icon-yanzhengma"></i>
<input type="text" placeholder="请输入验证码" onChange={ this.check.bind(this) }/>
<button className="checkBtn" disabled={ this.state.flag } onClick={ this.getCheck.bind(this) }>{ this.state.text }</button>
</p>

  设置初始的状态

this.state = {
_dura: 0,
text: '点击获取验证码',
flag: false
}

  点击获取验证码事件,这里我用到了 react-cookies 组件 要先去安装一下依赖 cnpm i react-cookies -S

 // 获取手机验证码
getCheck () {
let tel = this.state.tel
// console.log(tel)
if (tel.length !== 0) {
getCheck(tel).then(data => {
// 设置cookie保存时间
cookie.save('sendCode', 60, 60);
// console.log(data)
this.setState({
codeNum: data.data.data, // 保存随机验证码,后期用来验证
flag: true
})
this.sendCode();
})
} else {
Toast.fail('请先输入手机号', 1);
}
}

  封装sendCode(),为了处理页面刷新,倒计时被清除的问题,我们可以在发送了验证码时,设置一个时间,存在cookie里面,并且设置一个定时器,每秒更新一次cookie数据,和倒计时同步,下次在加载页面时,去判断cookie中该时间是否为0;

// 判断cookie中是否存在倒计时
sendCode () {
console.log(111)
this.setState({
flag: true
})
let _dura = cookie.load('sendCode');
let timer = setInterval(() => {
console.log(this)
_dura--;
let text = '重新获取' + '(' + _dura + ')';
this.setState({
_dura,
text
})
cookie.save('sendCode', _dura, _dura)
if (_dura === 0) {
text = '点击获取验证码';
this.setState({
text,
flag: false
})
clearInterval(timer);
timer = null;
cookie.remove('sendCode');
}
},1000)
}

  在生命周期函数钩子函数componentDidMount()中,调用,每次页面刷新都判断是否存在倒计时

componentDidMount () {
if (cookie.load('sendCode')) {
this.sendCode();
}
}

  注意,sendCode()函数,需要在两个地方去调用,第一个是在发送验证码成功时,第二个是在生命周期钩子函数中。

  以上是个人在写项目时的一些见解,如有不对的地方,欢迎指出。

最新文章

  1. Angular select 绑定复杂类型 设置默认项
  2. 设计模式学习系列6 原型模式(prototype)
  3. .NET4.5中WCF中默认生成的basicHttpsBinding的研究
  4. JQuery UI Widget Factory官方Demo
  5. SDPLR的安装过程(matlab)
  6. 一位ACM过来人的心得
  7. FZU Problem 1686 神龙的难题 重复覆盖
  8. MD5 加密 以及 加盐加密
  9. python语言学习8——字符串和编码
  10. AJAX验证码检查
  11. Chrome中xpath表达式巧妙获取
  12. 关于oracle设置主键自增的问题
  13. 移动端利用-webkit-box水平垂直居中(旧弹性盒)
  14. 单表40G,不要吃惊,还能往里面插入数据,哈哈
  15. 使用dom4j中SAXReader解析xml数据
  16. StringUtils工具类常用方法汇总(截取、去除空白、包含、查询索引)
  17. ORACLE11g下如何利用SQL DEVELOPER连接上数据库
  18. 删除weblogic应用缓存,weblogic 缓存的删除方法
  19. Ajax异步提交造成变量undefined
  20. Vim打开文件中文乱码如何解决?

热门文章

  1. 第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解
  2. 第三十一章、containers容器类部件QDockWidget停靠窗功能介绍
  3. Kubernetes 教程:在 Containerd 容器中使用 GPU
  4. Linux内核源码分析之setup_arch (二)
  5. Scrum 冲刺 第七篇
  6. vue项目中扫码枪收款
  7. 熊猫全球站视点关注,韩国投入47亿韩元开发区块链等ICT技术
  8. 【题解】G.Graph(2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest)
  9. 算法——K 个一组翻转链表
  10. 面试官:小伙子,你给我简单说一下RocketMQ 整合 Spring Boot吧