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 相关文章推荐
在页面上点击任一链接时触发一个事件的代码
Apr 07 Javascript
JS正则验证邮箱的格式详细介绍
Nov 19 Javascript
判断文件是否正在被使用的JS代码
Dec 21 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
Jun 23 Javascript
jQuery中的read和JavaScript中的onload函数的区别
Aug 27 Javascript
JavaScript实现简单图片翻转的方法
Apr 17 Javascript
javascript设计模式之对象工厂函数与构造函数详解
Jul 30 Javascript
JavaScript模拟数组合并concat
Mar 06 Javascript
js实现移动端微信页面禁止字体放大
Feb 16 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
Oct 26 Javascript
使用p5.js临摹动态图形
Oct 23 Javascript
javascript的delete运算符知识点总结
Nov 19 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
php 文章采集正则代码
2009/12/28 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
Yii中表单用法实例详解
2016/01/05 PHP
PHP Cookie学习笔记
2016/08/23 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
html下载本地
2006/06/19 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
JS对大量数据进行多重过滤的方法
2016/11/04 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
AngularJS服务service用法总结
2016/12/13 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
Python分割训练集和测试集的方法示例
2019/09/19 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
python如何实现DES加密
2020/09/21 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
某公司Java工程师面试题笔试题
2016/03/27 面试题
业务员岗位职责
2013/11/16 职场文书
毕业求职自荐信格式是什么
2013/11/19 职场文书
个人自荐书
2013/12/20 职场文书
英文商务邀请信
2014/01/22 职场文书
员工安全生产承诺书
2014/05/22 职场文书
经典毕业生求职信
2014/07/12 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
工作经验交流材料
2014/12/30 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
小学同学聚会感言
2015/07/30 职场文书