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 相关文章推荐
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
Dec 28 Javascript
jQuery取得select选择的文本与值的示例
Dec 09 Javascript
对于jQuery性能的一些优化建议
Aug 13 Javascript
JavaScript动态设置div的样式的方法
Dec 26 Javascript
es7学习教程之Decorators(修饰器)详解
Jul 21 Javascript
VUE页面中加载外部HTML的示例代码
Sep 20 Javascript
layer弹出层父子页面事件相互调用方法
Aug 17 Javascript
Vue.js实现表格渲染的方法
Sep 07 Javascript
Vue绑定内联样式问题
Oct 17 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
Dec 03 Javascript
简单使用webpack打包文件的实现
Oct 29 Javascript
js实现移动端吸顶效果
Jan 08 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
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
2017/08/15 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
jQuery+CSS3实现仿花瓣网固定顶部位置带悬浮效果的导航菜单
2016/09/21 Javascript
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
Python的函数嵌套的使用方法
2014/01/24 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
python创建子类的方法分析
2019/11/28 Python
Python partial函数原理及用法解析
2019/12/11 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
Pytorch 中的optimizer使用说明
2021/03/03 Python
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
企划专员岗位职责
2013/12/09 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
Python道路车道线检测的实现
2021/06/27 Python
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis
Android studio 简单计算器的编写
2022/05/20 Java/Android