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面向对象、prototype、call()、apply()
May 14 Javascript
QUnit jQuery的TDD框架
Nov 04 Javascript
Js如何判断客户端是PC还是手持设备简单分析
Nov 22 Javascript
jQuery避免$符和其他JS库冲突的方法对比
Feb 20 Javascript
js 3秒后跳转页面的实现代码
Mar 10 Javascript
JavaScript变量声明详解
Nov 27 Javascript
JavaScript实现点击按钮切换网页背景色的方法
Oct 17 Javascript
利用node.js制作命令行工具方法教程(一)
Jun 22 Javascript
JavaScript实现图片切换效果
Aug 12 Javascript
微信小程序页面滑动屏幕加载数据效果
Nov 16 Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 Javascript
vue.js实现图书管理功能
Sep 24 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相当简单的分页类
2008/10/02 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
2014/08/28 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
js获取单选按钮的数据
2006/11/27 Javascript
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
Django 使用logging打印日志的实例
2018/04/28 Python
Python3处理HTTP请求的实例
2018/05/10 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
python求解汉诺塔游戏
2020/07/09 Python
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
蜜蜂引路教学反思
2014/02/04 职场文书
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
岗位廉政承诺书
2014/03/27 职场文书
四议两公开实施方案
2014/03/28 职场文书
《画杨桃》教学反思
2014/04/13 职场文书
慰问信范文
2015/02/14 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
创业计划书之餐饮
2019/09/02 职场文书
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android