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倒数计时按钮setTimeout的实例代码
Jul 04 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
Feb 07 Javascript
跟我学习javascript的函数和函数表达式
Nov 16 Javascript
深入探讨前端框架react
Dec 09 Javascript
JavaScript实现DOM对象选择器
Sep 24 Javascript
关于JavaScript中forEach和each用法浅析
Jul 27 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
Nov 12 Javascript
js的对象与函数详解
Jan 21 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
Sep 19 Javascript
Vue中watch、computed、updated三者的区别及用法
Jul 27 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
Sep 21 Javascript
react项目从新建到部署的实现示例
Feb 19 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实现获取某个月份周次信息的方法
2015/08/11 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
javascript 数组的方法集合
2008/06/05 Javascript
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
2010/03/07 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
JavaScript构造函数详解
2015/12/27 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
bootstrap fileinput 上传插件的基础使用
2017/02/17 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
Python中表示字符串的三种方法
2017/09/06 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
为什么Python中没有&quot;a++&quot;这种写法
2018/11/27 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
Python实现12306火车票抢票系统
2019/07/04 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
python库matplotlib绘制坐标图
2019/10/18 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
中软国际Java程序员笔试题
2014/07/19 面试题
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
关于责任的演讲稿
2014/05/20 职场文书
单位实习鉴定评语
2015/01/04 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫