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脚本代码跑起来。
Jan 09 Javascript
javascript与cookie 的问题详解
Nov 11 Javascript
js中判断对象是否为空的三种实现方法
Dec 23 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
Apr 03 Javascript
jquery div模态窗口的简单实例
May 28 Javascript
JavaScript仿支付宝6位数字密码输入框
Dec 29 Javascript
简单实现js菜单栏切换效果
Mar 04 Javascript
详解webpack+vue-cli项目打包技巧
Jun 17 Javascript
利用HBuilder打包前端开发webapp为apk的方法
Nov 13 Javascript
JS实现的汉字与Unicode码相互转化功能分析
May 25 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
Jul 20 Javascript
Vue router安装及使用方法解析
Dec 02 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 管理系统程序中的后门
2009/08/05 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
php过滤XSS攻击的函数
2013/11/12 PHP
php过滤HTML标签、属性等正则表达式汇总
2014/09/22 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
apycom出品的jQuery精美菜单破解方法
2011/02/18 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
js实现类似iphone的网页滑屏解锁功能示例【附源码下载】
2019/06/10 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
Vue实现手机计算器
2020/08/17 Javascript
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
python 将md5转为16字节的方法
2018/05/29 Python
python斐波那契数列的计算方法
2018/09/27 Python
python pygame实现方向键控制小球
2019/05/17 Python
python微信公众号开发简单流程实现
2020/03/09 Python
django form和field具体方法和属性说明
2020/07/09 Python
python collections模块的使用
2020/10/16 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
俄罗斯儿童和青少年服装、鞋子及配件的在线商店:Orby
2020/02/20 全球购物
物理教育专业求职信
2014/06/25 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
小学教师求职信范文
2015/03/20 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
民事答辩状格式范文
2015/05/21 职场文书
Django路由层如何获取正确的url
2021/07/15 Python
mybatis 获取更新记录的id
2022/05/20 Java/Android