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 相关文章推荐
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
Jul 27 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
Oct 15 Javascript
使用jquery写个更改表格行顺序的小功能
Apr 29 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
浅谈JavaScript Math和Number对象
Jan 26 Javascript
jQuery同步提交示例代码
Dec 12 Javascript
JS实现太极旋转思路分析
Dec 09 Javascript
Node.js Express安装与使用教程
May 11 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
Aug 30 Javascript
vue+axios+element ui 实现全局loading加载示例
Sep 11 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
Oct 12 Javascript
深入webpack打包原理及loader和plugin的实现
May 06 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
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
firefox下input type=&quot;file&quot;的size是多大
2011/10/24 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
JS delegate与live浅析
2013/12/21 Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
2014/10/10 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
vue-loader中引入模板预处理器的实现
2019/09/04 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
sqlalchemy对象转dict的示例
2014/04/22 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
如何获取Python简单for循环索引
2019/11/21 Python
使用TensorFlow对图像进行随机旋转的实现示例
2020/01/20 Python
tensorflow模型保存、加载之变量重命名实例
2020/01/21 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
中国网上药店领导者:1药网
2017/02/16 全球购物
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
大学军训感想
2014/02/12 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
企业法人代表证明书
2015/06/18 职场文书
会议简报格式范文
2015/07/20 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
导游词之五台山
2019/10/11 职场文书
Win11更新失败并提示0xc1900101
2022/04/19 数码科技