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 相关文章推荐
Javascript限制网页只能在微信内置浏览器中访问
Nov 09 Javascript
JavaScript中自定义事件用法分析
Dec 23 Javascript
使用jQuery管理选择结果
Jan 20 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
Jun 05 Javascript
基于javascript实现仿百度输入框自动匹配功能
Jan 03 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
Jan 20 Javascript
jQuery向父辈遍历的简单方法
Sep 18 Javascript
基于javascript实现最简单选项卡切换
Feb 01 Javascript
值得分享和收藏的xmlplus组件学习教程
May 05 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
Aug 20 Javascript
Vue自定义组件双向绑定实现原理及方法详解
Sep 03 Javascript
js代码编写无缝轮播图
Sep 13 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高效率写法(详解原因)
2013/06/20 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
jquery.combobox中文api和例子,修复了上面的小bug
2011/03/28 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
jquery实现简单易懂的图片展示小例子
2013/11/21 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
js中调用微信的扫描二维码功能的实现代码
2020/04/11 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
跟老齐学Python之复习if语句
2014/10/02 Python
利用python将图片转换成excel文档格式
2017/12/30 Python
matplotlib实现区域颜色填充
2019/03/18 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
美国皮靴公司自1863年:The Frye Company
2016/11/30 全球购物
如何高效率的查找一个月以内的数据
2012/04/15 面试题
工程概预算专业毕业生求职信
2013/10/04 职场文书
求职信模版
2013/11/30 职场文书
大学毕业生通用自我评价
2014/01/05 职场文书
电焊工岗位职责
2014/03/06 职场文书
慈善晚会策划方案
2014/05/14 职场文书
垃圾桶标语
2014/06/24 职场文书
企业员工集体活动方案
2014/08/17 职场文书
2014年关工委工作总结
2014/11/17 职场文书
工作会议通知
2015/04/15 职场文书
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL