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的Date方法实现代码(prototype)
Nov 20 Javascript
Ext JS添加子组件的误区探讨
Jun 28 Javascript
js由下向上不断上升冒气泡效果实例
May 07 Javascript
JQuery给网页更换皮肤的方法
May 30 Javascript
jQuery实现的图文高亮滚动切换特效实例
Aug 10 Javascript
jQuery中选择器的基础使用教程
May 23 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
Jul 13 Javascript
vue学习教程之带你一步步详细解析vue-cli
Dec 26 Javascript
ajax与jsonp的区别及用法
Oct 16 Javascript
js中的数组对象排序分析
Dec 11 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
May 14 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
Jun 02 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
8个必备的PHP功能实例代码
2013/10/27 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
JavaScript的继承的封装介绍
2013/10/15 Javascript
javascript的动态加载、缓存、更新以及复用(一)
2014/06/09 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
python使用心得之获得github代码库列表
2014/06/25 Python
Python基于有道实现英汉字典功能
2015/07/25 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
Python中进程和线程的区别详解
2017/10/29 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
工程业务员工作职责
2013/12/07 职场文书
校运会入场式解说词
2014/02/10 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
欠条范文
2015/07/03 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
股权投资协议书
2016/03/23 职场文书
Win11查看设备管理器
2022/04/19 数码科技