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 相关文章推荐
Add Formatted Data to a Spreadsheet
Jun 12 Javascript
jquery插件制作教程 txtHover
Aug 17 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
Apr 12 Javascript
js跳转页面方法总结
Jan 29 Javascript
基于javascript bootstrap实现生日日期联动选择
Apr 07 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
May 17 Javascript
javascript表达式和运算符详解
Feb 07 Javascript
Vue.js中的图片引用路径的方式
Jul 28 Javascript
你可能不知道的JSON.stringify()详解
Aug 17 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
Jun 14 Javascript
Js图片点击切换轮播实现代码
Jul 27 Javascript
vue 获取url里参数的两种方法小结
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 工厂模式使用方法
2010/05/18 PHP
php array_map()函数实例用法
2021/03/03 PHP
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
Python文件处理
2016/02/29 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
大学校庆邀请函
2014/01/11 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书