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 相关文章推荐
JavaScript 三种创建对象的方法
Oct 16 Javascript
js 距离某一时间点时间是多少实现代码
Oct 14 Javascript
深入理解javascript严格模式(Strict Mode)
Nov 28 Javascript
jQuery的css()方法用法实例
Dec 24 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
Apr 15 Javascript
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
Dec 26 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
Mar 11 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
May 30 Javascript
JS获取url参数、主域名的方法实例分析
Aug 03 Javascript
浅谈Vue 初始化性能优化
Aug 31 Javascript
封装Vue Element的table表格组件的示例详解
Aug 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语法(5)
2006/10/09 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
jQuery对Select的操作大集合(收藏)
2013/12/28 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
浅谈React中的元素、组件、实例和节点
2018/02/27 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
JS代码优化的8点建议
2020/02/04 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
python实现统计代码行数的方法
2015/05/22 Python
Python操作Access数据库基本步骤分析
2016/09/19 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
Selenium定位元素操作示例
2018/08/10 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
2019/10/11 Python
django实现用户注册实例讲解
2019/10/30 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
报到证丢失证明
2014/01/11 职场文书
校长新学期致辞
2015/07/30 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript