国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

js實現多個倒計時并行 js拼團倒計時

2019-11-19 12:04:28
字體:
來源:轉載
供稿:網友

本文是對類似于拼團,多個商品每個都有各自的倒計時,一開始接到接到這個需求也是頭疼了一陣子,如果是在商品列表少的時候完全就可以寫成死的,固定的變量,寫幾個定時器就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 })}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 雷山县| 大英县| 沈丘县| 福清市| 井冈山市| 清丰县| 贵港市| 六盘水市| 富宁县| 禹城市| 孙吴县| 安平县| 凤山市| 九龙县| 弋阳县| 呼图壁县| 田阳县| 和硕县| 丰都县| 姚安县| 益阳市| 壤塘县| 当雄县| 临清市| 金湖县| 洪湖市| 南丰县| 依兰县| 南京市| 望都县| 天全县| 栾川县| 沧州市| 萨迦县| 阳谷县| 平果县| 平阴县| 淮南市| 土默特右旗| 岗巴县| 都安|