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 相关文章推荐
如何在标题栏显示框架内页面的标题
Feb 03 Javascript
juqery 学习之三 选择器 层级 基本
Nov 25 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
Apr 14 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
Aug 20 Javascript
javascript中获取元素标签中间的内容的实现方法
Oct 08 Javascript
使用jquery datatable和bootsrap创建表格实例代码
Mar 17 Javascript
JavaScript ES2019中的8个新特性详解
Feb 20 Javascript
koa+jwt实现token验证与刷新功能
May 30 Javascript
javascript防抖函数debounce详解
Jun 11 Javascript
带你使用webpack快速构建web项目的方法
Nov 12 Javascript
详解Vue的mixin策略
Nov 19 Vue.js
JS监听Esc 键触发事键
Apr 14 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
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
php 面试碰到过的问题 在此做下记录
2011/06/09 PHP
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
php数组转成json格式的方法
2015/03/09 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
基于vue-video-player自定义播放器的方法
2018/03/21 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
python使用append合并两个数组的方法
2015/04/28 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
介绍一下Make? 为什么使用make
2013/12/08 面试题
英语硕士生求职简历的自我评价
2013/10/15 职场文书
演讲主持词
2014/03/18 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
师范生见习总结范文
2015/06/23 职场文书
postgresql无序uuid性能测试及对数据库的影响
2021/06/11 PostgreSQL
Python中else的三种使用场景
2021/06/16 Python
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers