网站首页 > 博客文章 正文
这是个发送验证码时常用的功能,当用户点击【发送验证码】之后出现【重新获取60s后】。在倒计时期间禁止用户继续发送验证码,待倒计时结束之后才可以再次发送验证码。这个可以避免重复发送请求获取多个验证码信息(但是只有最后一次才是有效的),你也不知道自己发送了几次请求,当手机接收到验证码之后容易误以为是正确的验证码。所以做适当的控制是非常有必要的,同时也可以防止恶意发送请求消耗服务器资源。
HTML构建
为了方便这里我们用ElementUI来实现,在el-form-item中利用el-button按钮来实现验证码发送。发送验证码之后直接在el-button上修改现实中在HTML中的【发送验证码】内容,利用disabled属性来控制el-button的是否可以点击。
重新获取倒计时
定义一个retrieve()方法开启倒计时功能,利用setInterval计时器每隔一秒钟调用一次函数,当倒计时结束时通过clearInterval()来关闭计时器。这里我们需要做的是刷新时间和重定义el-button中的HTML内容,disable是用来控制el-button按钮是否可点击的属性。注意:disabled属性别用this.$refs.onConfirm.disbaled=true来定义,会报警告的:Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "disabled"。
发送验证码
在发送之前我们需要对表单中的数据进行校验,这里为什么要嵌套两个validateField呢(validateField支持校验组数)?。因为validateField校验子表单数据时每校验一个值都会返回校验结果,当校验不通过时Error返回值为校验的提示信息,当通过时Error的值为空,所以我们在if语句中用(!Error)表示校验通过。那么这就存在一个问题如果校验数组的话就会进行多次校验,也就会发送多次验证请求。(点一次请求却收到多条验证码这显然是不合理的!)
总结:
这里主要的就是retrieve()方法的定义和动态改变HTML内容,可以利用Vue提供的$ref来快速的定位DOM元素实现属性的修改。以上内容是小编给大家分享的【Vue实战088:简单的验证码倒计时功能实现】,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。更多Vue实战技巧可以参考以下专栏:
为了方便学习,下面附上本文用到的源码:
<el-form-item prop="vercode">
<svg-icon icon-class="vercode"
:style="{color:checks? 'green':'rgb(204, 201, 201)'}" /></span>
<el-input placeholder="请输入验证码"
name="password"
type="text"
v-model="userForm.vercode"
@blur="mateCode"
autocomplete="on" />
<el-button class="Confirm" ref="onConfirm"
:disabled="disable? true:false" @click="sendCode">发送验证码</el-button>
</el-form-item>
retrieve(){
this.timer= 10
var that = this;
console.log(that.$refs.onConfirm)
var timer_interval = setInterval(function(){
if(that.timer > 0 ){
that.timer -- ;
that.disable=true
that.$nextTick(()=>{
that.$refs.onConfirm.$el.children[0].innerHTML= "重新获取"+that.timer+"s"
})
}else{
clearInterval(timer_interval);
that.$refs.onConfirm.$el.children[0].innerHTML= "重新获取"
that.disable=false
}
},1000);
}
sendCode() {
this.$refs.rulesForm.validateField('userid',(error)=>{
if(!error){
this.$refs.rulesForm.validateField('tel',(error)=>{
if(!error){
return new Promise((resolve, reject) => {
SendCode(this.userForm).then(res=>{
if(res.data){
this.retrieve()
this.phoneCode=res.data.message
this.$message({
message:'验证码已发送,请注意查收!',
type: 'success'
})
}
resolve()
}).catch( error => { reject(error) } )
})}
})
}else{ return }
})
},
猜你喜欢
- 2024-09-26 Vue3全新的前端构建工具vite学习(前端vue项目开发流程及架构)
- 2024-09-26 Vue核心知识:8.5如何在vuex中使用异步修改?推荐行为触发action
- 2024-09-26 Vue.nextTick 的工作机制(vue中nexttick原理)
- 2024-09-26 ES6(四)用Promise封装一下IndexedDB
- 2024-09-26 Vue项目处理错误上报如此简单(vue项目中遇到的问题,你是怎么解决)
- 2024-09-26 Vue开发:通过异步的方式加载vue组件
- 2024-09-26 Vue.js项目模板搭建(vue.js环境搭建)
- 2024-09-26 vue.js深入篇(一、响应式原理)(vue响应式源码解析)
- 2024-09-26 Vue中的nextTick方法是用来做什么的?
- 2024-09-26 Vue - 简单实现一个命令式弹窗组件
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)