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 相关文章推荐
禁止F5等快捷键的JS代码
Mar 06 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
Feb 07 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
Jan 03 Javascript
javascript中的绑定与解绑函数应用示例
Jun 24 Javascript
JS 动态判断PC和手机浏览器实现代码
Sep 21 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
Aug 29 Javascript
VUE DOM加载后执行自定义事件的方法
Sep 07 Javascript
Vue 动态添加路由及生成菜单的方法示例
Jun 20 Javascript
vue 实现setInterval 创建和销毁实例
Jul 21 Javascript
解决Antd Table组件表头不对齐的问题
Oct 27 Javascript
Node.js path模块,获取文件后缀名操作
Nov 07 Javascript
如何优化vue打包文件过大
Apr 13 Vue.js
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环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
Discuz! Passport 通行证整合
2008/03/27 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
js同时按下两个方向键
2007/12/01 Javascript
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
需要做特殊处理的DOM元素属性的访问
2010/11/05 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
django 多数据库配置教程
2018/05/30 Python
python+numpy+matplotalib实现梯度下降法
2018/08/31 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
Django集成MongoDB实现过程解析
2020/12/01 Python
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
优秀生推荐信范文
2013/11/28 职场文书
会议主持词
2014/03/17 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
群众路线调研报告范文
2014/11/03 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
周年庆典答谢词
2015/01/20 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python