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 表单验证插件formValidation实现个性化错误提示
Jun 23 Javascript
基于jquery tab切换(防止页面刷新)
May 23 Javascript
Javascript拓展String方法小结
Jul 08 Javascript
jquery用offset()方法获得元素的xy坐标
Sep 06 Javascript
jquery使用hide方法隐藏指定id的元素
Mar 30 Javascript
Javascript中call,apply,bind方法的详解与总结
Dec 12 Javascript
ECMAScript6 新特性范例大全
Mar 24 Javascript
如何以Angular的姿势打开Font-Awesome详解
Apr 22 Javascript
webpack多入口多出口的实现方法
Aug 17 Javascript
angularjs http与后台交互的实现示例
Dec 21 Javascript
vxe-table vue table 表格组件功能
May 26 Javascript
生成无限制的微信小程序码的示例代码
Sep 20 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
Yii2中添加全局函数的方法分析
2017/05/04 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
Js切换功能的简单方法
2010/11/23 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
javascript-简单的计算器实现步骤分解(附图)
2013/05/30 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
详解Python如何获取列表(List)的中位数
2016/08/12 Python
Numpy数据类型转换astype,dtype的方法
2018/06/09 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
JAVA软件工程师测试题
2014/07/25 面试题
工商学院毕业生自荐信
2013/11/12 职场文书
司机检讨书
2014/02/13 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
承诺书范本大全
2015/05/04 职场文书
教育教学读书笔记
2015/07/02 职场文书
你会写请假条吗?
2019/06/26 职场文书
浅析Python OpenCV三种滤镜效果
2022/04/11 Python
Python PIL按比例裁剪图片
2022/05/11 Python