Vue写一个简单的倒计时按钮功能


Posted in Javascript onApril 20, 2018

在项目开发里,我们经常会遇到发送验证码、点击了之后有60秒倒计时的按钮,很常见却也很简单,但是在写这个按钮的时候有个别地方还要注意下,今天写出来,如有问题欢迎指正!

完成的效果如下:

Vue写一个简单的倒计时按钮功能 

为了更快显示出效果,我把时间设成了5秒。按钮在点击之后会出现倒计时,同时按钮变为不可点击状态,样式也发生变化,鼠标悬浮上的样子也会发生变化。

接下来我们用代码来实现:

<button class="button" @click="countDown">
 {{content}}
</button>

...

data () {
  return {
   content: '发送验证码',  // 按钮里显示的内容
   totalTime: 60      //记录具体倒计时时间
  }
},
methods: {
  countDown() {
    let clock = window.setInterval(() => {
      this.total--
      this.content = this.total + 's后重新发送'
    },1000)
  }
}

在data里加了两条数据,一条用来记录时间,一条用来盛放倒计时按钮的具体内容。在countDown函数里我们用了setInterval定时器,每隔一秒totalTime减1,同时更改按钮里显示的内容。 在window.setInterval里用了箭头函数,因为它会自动绑定外面的this,所以就不用先存下this了。

效果如下图:

Vue写一个简单的倒计时按钮功能 

但是这个按钮还有一些问题:

点击了按钮之后过了1秒就直接从59秒开始倒计时了,中间的60不见了
倒计时的时候还可以点击
还没有清除倒计时

接下来需要继续完善countDown函数来解决这些问题。

countDown () {
 this.content = this.totalTime + 's后重新发送' //这里解决60秒不见了的问题
 let clock = window.setInterval(() => {
  this.totalTime--
  this.content = this.totalTime + 's后重新发送'
  if (this.totalTime < 0) {     //当倒计时小于0时清除定时器
    window.clearInterval(clock)
    this.content = '重新发送验证码'
    this.totalTime = 60
    }
 },1000)
},

上面的代码解决了60不见的问题,同时当totalTime小于0时清除同时器、重新设置按钮里的content、将totalTime重置为60以便下次使用。

倒计10秒的效果:

Vue写一个简单的倒计时按钮功能 

发现bug,多次点击之后,倒讲时速度变快,这是因为每次点击都会启动一个setInterval,这些setInterval都会减少totalTime。解决的方法也很简单:简单节流一下就好了,就是第一次点击按钮之后让countDonw这个函数的代码不可执行,等到倒计时结束之后才可以再次执行。

data () {
  return {
   content: '发送验证码',
   totalTime: 10,
   canClick: true //添加canClick
  }
}

...

countDown () {
 if (!this.canClick) return  //改动的是这两行代码
 this.canClick = false
 this.content = this.totalTime + 's后重新发送'
 let clock = window.setInterval(() => {
  this.totalTime--
  this.content = this.totalTime + 's后重新发送'
  if (this.totalTime < 0) {
   window.clearInterval(clock)
   this.content = '重新发送验证码'
   this.totalTime = 10
   this.canClick = true  //这里重新开启
  }
 },1000)
}

在data里添加canClick,默认是true,如果canClick为true,countDown里的代码可以执行,如果是false就不行。每执行一次就将canClick设为false,而只在倒计时结束的时候再改为true。这样刚才的问题就没有了。

Vue写一个简单的倒计时按钮功能 

到这里其实就差不多了,不过还可以调整下样式:

<button class="button" :class="{disabled: !this.canClick}" @click="countDown">
...
.disabled{
 background-color: #ddd;
 border-color: #ddd;
 color:#57a3f3;
 cursor: not-allowed; // 鼠标变化
}

效果:

Vue写一个简单的倒计时按钮功能 

这个倒计时按钮十分简单,但是我第一次写的时候还是写的很乱,而且那个时候还不知道函数节流的概念。

总结

以上所述是小编给大家介绍的Vue写一个简单的倒计时按钮功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JQuery实现用户名无刷新验证的小例子
Mar 22 Javascript
利用JS实现浏览器的title闪烁
Jul 08 Javascript
JQuery的$命名冲突详细解析
Dec 28 Javascript
JavaScript函数模式详解
Nov 07 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
Dec 18 Javascript
学习JavaScript设计模式(接口)
Nov 26 Javascript
不能不知道的10个angularjs英文学习网站
Mar 23 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
Jul 07 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
Dec 20 Javascript
vue.js学习笔记:如何加载本地json文件
Jan 17 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
Apr 13 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
Nov 12 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
Apr 20 #Javascript
Vue中如何实现proxy代理
Apr 20 #Javascript
React diff算法的实现示例
Apr 20 #Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
Apr 20 #Javascript
node实现登录图片验证码的示例代码
Apr 20 #Javascript
vue项目中api接口管理总结
Apr 20 #Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
Apr 19 #jQuery
You might like
推荐个功能齐全的发送PHP邮件类
2007/01/03 PHP
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
PHP 防恶意刷新实现代码
2010/05/16 PHP
php网站判断用户是否是手机访问的方法
2013/11/01 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
JavaScript中OnLoad几种使用方法
2012/12/15 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
Python递归函数定义与用法示例
2017/06/02 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
简单了解python元组tuple相关原理
2019/12/02 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
python实现飞船大战
2020/04/24 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
出纳岗位职责模板
2013/11/27 职场文书
工商企业管理实习自我鉴定
2013/12/04 职场文书
自我反省检讨书
2014/01/23 职场文书
药剂专业求职信
2014/06/20 职场文书
争先创优公开承诺书
2014/08/30 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python