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实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
Mar 21 Javascript
JS 事件绑定函数代码
Apr 28 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
Apr 17 Javascript
js select option对象小结
Dec 20 Javascript
javascript中使用new与不使用实例化对象的区别
Jun 22 Javascript
微信小程序使用modal组件弹出对话框功能示例
Nov 29 Javascript
Vue DevTools调试工具的使用
Dec 05 Javascript
Angular2使用vscode断点调试ts文件的方法
Dec 13 Javascript
Vue实现根据hash高亮选项卡
May 27 Javascript
bootstrap-table后端分页功能完整实例
Jun 01 Javascript
详解微信小程序动画Animation执行过程
Sep 23 Javascript
js正则匹配markdown里的图片标签的实现
Mar 24 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
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
PHP后期静态绑定实例浅析
2018/12/21 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
2014/06/09 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
2015/05/04 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
React-Native左右联动List的示例代码
2017/09/21 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
Bootstrap模态对话框中显示动态内容的方法
2018/08/10 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
Python使用MD5加密算法对字符串进行加密操作示例
2018/03/30 Python
python操作redis方法总结
2018/06/06 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
Python实现12306火车票抢票系统
2019/07/04 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
J2EE相关知识面试题
2013/08/26 面试题
面试后的英文感谢信
2014/02/01 职场文书
10的分与合教学反思
2014/04/30 职场文书
体育教师求职信
2014/05/24 职场文书
超市创意活动方案
2014/08/15 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
Go各时间字符串使用解析
2021/04/02 Golang
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang