js实现多个倒计时并行 js拼团倒计时


Posted in Javascript onFebruary 25, 2019

本文是对类似于拼团,多个商品每个都有各自的倒计时,一开始接到接到这个需求也是头疼了一阵子,如果是在商品列表少的时候完全就可以写成死的,固定的变量,写几个定时器就ok了,

但是这次数据是活的,看一些拼团app都可以实现,既然能实现就搞起来,有了以下的想法 使用环境 vue

写一个准备渲染的死数据

data () {
 return {
  list: [ // 准备渲染的数据
   {
    remainTime: 900000, // 距离结束还有多久
    remainTimeStr: '' // 展示文案
   },
   {
    remainTime: 400000,
    remainTimeStr: ''
   },
   {
    remainTime: 60500,
    remainTimeStr: ''
   },
  ]
 }
}

百度copy一个倒计时的方法

countdowm (timestamp) {
 let self = this
 let timer = setInterval(function () {
  let nowTime = new Date()
  let endTime = new Date(timestamp)
  let t = endTime.getTime() - nowTime.getTime()
  if (t > 0) {
   let day = Math.floor(t / 86400000)
   let hour = Math.floor((t / 3600000) % 24)
   let min = Math.floor((t / 60000) % 60)
   let sec = Math.floor((t / 1000) % 60)
   hour = hour < 10 ? '0' + hour : hour
   min = min < 10 ? '0' + min : min
   sec = sec < 10 ? '0' + sec : sec
   let format = ''
   if (day > 0) {
    format = `${day}天${hour}小时${min}分${sec}秒`
   }
   if (day <= 0 && hour > 0) {
    format = `${hour}小时${min}分${sec}秒`
   }
   if (day <= 0 && hour <= 0) {
    format = `${min}分${sec}秒`
   }
   self.content = format
  } else {
   clearInterval(timer)
   self.content = 'over'
  }
 }, 1000)
}

捋清逻辑

首先, 根据逻辑对倒计时的方法进行更改,我们直接使用的就是距离结束还有多少时间的时间戳 ,我的思路是用一个定时器达到一个并行多个倒计时的思路,所以先将方法进行优化

  • 不需要获取时间
  • 也不需要一些时间计算
  • 因为是多个倒计时并行 所以清楚定时器的逻辑需要进行更改
countdowm (timestamp) {
 let self = this
 let timer = setInterval(function () {
  let t = timestamp
  if (t > 0) {
   let day = Math.floor(t / 86400000)
   let hour = Math.floor((t / 3600000) % 24)
   let min = Math.floor((t / 60000) % 60)
   let sec = Math.floor((t / 1000) % 60)
   day = day < 10 ? '0' + day : day
   hour = hour < 10 ? '0' + hour : hour
   min = min < 10 ? '0' + min : min
   sec = sec < 10 ? '0' + sec : sec
   let format = ''
   format = `${day}天${hour}小时${min}分${sec}秒`
   self.content = format
  } else {
   // clearInterval(timer)
   self.content = 'over'
  }
 }, 1000)
}

简化完毕, 把自己刚才的思路带进方法内

在定时器里 写一个循环 每次减少一秒 让当前数据内remainTime时间戳-1000

countdown () {
 let self = this
 let timer = setInterval(function () {
  for (let i = 0; i < self.list.length; i++) {
   self.list[i].remainTime -= 1000
   let t = self.list[i].remainTime
   if (t > 0) {
    let day = Math.floor(t / 86400000)
    let hour = Math.floor((t / 3600000) % 24)
    let min = Math.floor((t / 60000) % 60)
    let sec = Math.floor((t / 1000) % 60)
    day = day < 10 ? '0' + day : day
    hour = hour < 10 ? '0' + hour : hour
    min = min < 10 ? '0' + min : min
    sec = sec < 10 ? '0' + sec : sec
    let format = ''
    format = `距离结束:<b>${day}</b> 天 <b>${hour}</b> 
时 <b>${min}</b> 分 <b>${sec}</b> 秒`
    self.list[i].remainTimeStr = format
    } else {
    // 进行判断 如果数据内所有的倒计时已经结束,那么结束定时器, 如果没有那么继续执行定时器
    let flag = self.list.every((val, ind) => 
 
val.remainTime <= 0)
    if (flag) clearInterval(timer)
    self.list[i].remainTimeStr = `距离结束:<b>00</b> 天 
<b>00</b> 时 <b>00</b> 分 <b>00</b> 秒` // 结束文案
    }
  }
 }, 1000)
}

这样 并行多个定时器就做好了, 但是发现了一个问题 当你切换路由的时候 发下你的定时器如果未结束 他还在执行,这样对性能造成了一些影响, 虽说用户看不到,但是也要解决,提高用户浏览体验
在你切换页面的时候 使用vue中的生命周期函数把数据更改为0 就ok

destroyed () {
 this.list.forEach((val) => {
  val.remainTime = 0
 })
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
Nov 04 Javascript
某页码显示的helper 少量调整,另附js版
Sep 12 Javascript
基于jquery实现状态限定编辑的代码
Feb 11 Javascript
js获取鼠标点击的位置实现思路及代码
May 09 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
Mar 18 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
Mar 21 Javascript
JS区分浏览器页面是刷新还是关闭
Apr 17 Javascript
第九篇Bootstrap导航菜单创建步骤详解
Jun 21 Javascript
基于vue的下拉刷新指令和滚动刷新指令
Dec 23 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
Mar 24 jQuery
JS动画实现回调地狱promise的实例代码详解
Nov 08 Javascript
javascript实现点击按钮切换轮播图功能
Sep 23 Javascript
js实现网页同时进行多个倒计时功能
Feb 25 #Javascript
js实现一个页面多个倒计时的3种方法
Feb 25 #Javascript
Vue自定义指令上报Google Analytics事件统计的方法
Feb 25 #Javascript
写一个Vue Popup组件
Feb 25 #Javascript
利用Webpack实现小程序多项目管理的方法
Feb 25 #Javascript
JavaScript中构造函数与原型链之间的关系详解
Feb 25 #Javascript
JavaScript中的事件与异常捕获详析
Feb 24 #Javascript
You might like
合作指挥官:孟斯克
2020/03/16 星际争霸
PHP 类相关函数的使用详解
2013/05/10 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
实用javaScript技术-屏蔽类
2006/08/15 Javascript
JavaScript delete 属性的使用
2009/10/08 Javascript
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
jquery实现叠层3D文字特效代码分享
2015/08/21 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
让代码变得更易维护的7个Python库
2018/10/09 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
python ubplot使用方法解析
2020/01/10 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
如何编写python的daemon程序
2021/01/07 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
过滤器的用法
2013/10/08 面试题
学习十八大报告感言
2014/02/04 职场文书
小学生安全保证书
2015/05/09 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
《穷人》教学反思
2016/02/19 职场文书
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android