react项目中登陆注册验证码的倒计时,页面刷新不会重置
目前很多的网站和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()函数,需要在两个地方去调用,第一个是在发送验证码成功时,第二个是在生命周期钩子函数中。
以上是个人在写项目时的一些见解,如有不对的地方,欢迎指出。
react项目中登陆注册验证码的倒计时,页面刷新不会重置的更多相关文章
- 如何在非 React 项目中使用 Redux
本文作者:胡子大哈 原文链接:https://scriptoj.com/topic/178/如何在非-react-项目中使用-redux 转载请注明出处,保留原文链接和作者信息. 目录 1.前言 2. ...
- 如何优雅地在React项目中使用Redux
前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...
- react项目中实现元素的拖动和缩放实例
在react项目中实现此功能可借助 react-rnd 库,文档地址:https://github.com/bokuweb/react-rnd#Screenshot .下面是实例运用: import ...
- React项目中实现右键自定义菜单
最近在react项目中需要实现一个,右键自定义菜单功能.找了找发现纯react项目里没有什么工具可以实现这样的功能,所以在网上搜了搜相关资料.下面我会附上完整的组件代码. (注:以下代码非本人原创,具 ...
- React项目中使用Mobx状态管理(二)
并上一节使用的是普通的数据状态管理,不过官方推荐使用装饰器模式,而在默认的react项目中是不支持装饰器的,需要手动启用. 官方参考 一.添加配置 官方提供了四种方法, 方法一.使用TypeScrip ...
- 在react项目中使用ECharts
这里我们要在自己搭建的react项目中使用ECharts,我们可以在ECharts官网上看到有一种方式是在 webpack 中使用 ECharts,我们需要的就是这种方法. 我们在使用ECharts之 ...
- 优雅的在React项目中使用Redux
概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在 ...
- 深入浅出TypeScript(5)- 在React项目中使用TypeScript
前言 在第二小节中,我们讨论了利用TypeScript创建Web项目的实现,在本下节,我们讨论一下如何结合React创建一个具备TypeScript类型的应用项目. 准备 Webpack配置在第二小节 ...
- redux在react项目中的应用
今天想跟大家分享一下redux在react项目中的简单使用 1 1.redux使用相关的安装 yarn add redux yarn add react-redux(连接react和redux) 2. ...
随机推荐
- 死磕以太坊源码分析之Fetcher同步
死磕以太坊源码分析之Fetcher同步 Fetcher 功能概述 区块数据同步分为被动同步和主动同步: 被动同步是指本地节点收到其他节点的一些广播的消息,然后请求区块信息. 主动同步是指节点主动向其他 ...
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T2 Lucas的数列
[NOIP2015模拟11.5]JZOJ8月5日提高组T2 Lucas的数列 题目 PS:\(n*n*T*T<=10^{18}\)而不是\(10^1*8\) 题解 题意: 给出\(n\)个元素的 ...
- Java 命名之道
为什么需要重视命名? 好的命名即是注释,别人一看到你的命名就知道你的变量.方法或者类是做什么的! 好的命名对于其他人(包括你自己)理解你的代码有着很大的帮助! 简单举个例子说明一下命名的重要性. &l ...
- cookie倒计时
使用cookie倒计时60s Vue实例创建一个变量time=0 生命周期一般是created,给time赋值一个cookie的键值-当前的时间(因为刚进入页面这时是没有cookie的,所以time变 ...
- 基础篇——SpringCloudAlibaba分布式组件
官方文档:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md 想要使用SpringCloudAlibaba ...
- Android10_原理机制系列_事件传递机制
前言和概述 Android的输入设备,最常用的就是 触摸屏和按键 了.当然还有其他方式,比如游戏手柄,比如支持OTG设备,则可以链接鼠标.键盘等. 那么这些设备的操作 是如何传递到系统 并 控制界面的 ...
- 基于gin的golang web开发:服务间调用
微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...
- css3实现立体魔方效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- bootstrap table处理后台返回的数据
- protobuf 协议浅析
目录 Protobuf 协议浅析 1. Protobuf 介绍 1.1 Protobuf 基本概念 1.2 Protobuf 的优点 1.3 Protobuf, JSON, XML 的区别 2. Pr ...