小程序?qū)崿F(xiàn)倒計(jì)時(shí)組件的使用示例
需求背景
要做一個(gè)倒計(jì)時(shí),可能是天級(jí)別,也可能是日級(jí)別,時(shí)級(jí)別,而且每個(gè)有效訂單都要用,就做成組件了
效果圖
需求分析
- 需要一個(gè)未來的時(shí)間戳,或者在服務(wù)度直接下發(fā)一個(gè)未來到現(xiàn)在時(shí)間差,我們只需要做倒計(jì)時(shí)
- 進(jìn)入頁(yè)面,看是否已經(jīng)結(jié)束, 如果沒結(jié)束就調(diào)用倒計(jì)時(shí)函數(shù)
- 每隔1000,做時(shí)間戳(毫秒) -1000。邊做tick ,邊做時(shí)間格式化。
- 每次調(diào)用前,先清除上一個(gè)定時(shí)器
- 組件銷毀的時(shí)候,也要清除一下定時(shí)器
代碼實(shí)現(xiàn)
設(shè)置初始值,也是1秒,這里單位時(shí)毫秒
const interval = 1000;
進(jìn)入頁(yè)面,初始化完成。開始判斷是否結(jié)束
lifetimes: { ready() { this.startCountdown(); }, detached() { clearTimeout(this.timer); }, },
startCountdown() { const lastTime = this.initTime(this.properties.expireTime); // 這一步,如果服務(wù)端返回了未來到現(xiàn)在的差值,則不需要自己計(jì)算時(shí)間差了 // 如果最終時(shí)間 < 1000ms 說明 已經(jīng)過期了,就不用展示倒計(jì)時(shí)了. if (lastTime > interval) { // 格式化要展示的數(shù)據(jù) this.defaultFormat(lastTime); this.setData({ isCountOver: true, // 標(biāo)識(shí)可以顯示倒計(jì)時(shí) lastTime, // set lastTime }); // 調(diào)用倒計(jì)時(shí)函數(shù),主要的邏輯就是每隔1000ms ,讓lastTime - 1000 this.tick(); } },
初始化時(shí)間: 如果服務(wù)度返回了時(shí)間差,這一步不用處理
//初始化時(shí)間 initTime(expireTime) { let lastTime = Number(new Date(expireTime * 1000)) - new Date().getTime(); console.log('lastTime', lastTime); return Math.max(lastTime, 0); },
時(shí)間的格式化處理,這里都是固定代碼,沒什么含量
//默認(rèn)處理時(shí)間格式 defaultFormat(time) { const days = 60 * 60 * 1000 * 24; const hours = 60 * 60 * 1000; const minutes = 60 * 1000; const d = Math.floor(time / days); const h = Math.floor((time % days) / hours); const m = Math.floor((time % hours) / minutes); const s = Math.floor((time % minutes) / 1000); this.setData({ d: this.fixedZero(d), h: this.fixedZero(h), m: this.fixedZero(m), s: this.fixedZero(s), }); }, // 格式化時(shí)間加0 fixedZero(val) { return val < 10 ? `0${val}` : val; },
tick 倒計(jì)時(shí)函數(shù)
tick() { let { lastTime } = this.data; this.timer = setTimeout(() => { // 每次定時(shí)器之前,先把上一個(gè)定時(shí)器清除 clearTimeout(this.timer); // 如果倒計(jì)時(shí)結(jié)束,這是結(jié)束的狀態(tài) if (lastTime < interval) { this.setData({ lastTime: 0, isCountOver: false, }); } else { // 如果倒計(jì)時(shí)正常,則每次 -1000 ,并且格式化時(shí)間。再次調(diào)用tick,直到倒計(jì)時(shí)結(jié)束 lastTime -= 1000; this.setData( { lastTime, }, () => { this.defaultFormat(lastTime); this.tick(); }, ); } }, interval); },
完整代碼
父組件(我這里傳了一個(gè)比較大的時(shí)間戳,2024,10.1結(jié)束的時(shí)間戳)
<order-time expireTime="{{ 1727712000 }}"> <view slot="desc">還剩</view> </order-time>
子組件 (wxml)
<view wx:if="{{ isCountOver }}" class="timer-wrap"> <slot name="desc" /> <view class="reset-time"> <text wx:if="{{ d != '00' }}"> {{ d }}天</text> {{ h }}:{{ m }}:{{ s }}</view > </view> <view wx:else class="reset-time"> {{ emptyType === '1' ? '已超時(shí)': '' }} </view>
子組件 (js)
let interval = 1000; Component({ options: { multipleSlots: true, }, properties: { expireTime: { type: String, }, emptyType: { type: String, value: '1', }, }, lifetimes: { ready() { this.startCountdown(); }, detached() { clearTimeout(this.timer); }, }, /** * 組件的初始數(shù)據(jù) */ data: { d: 0, //天 h: 0, //時(shí) m: 0, //分 s: 0, //秒 lastTime: '', //倒計(jì)時(shí)的時(shí)間戳 isCountOver: false, // 倒計(jì)時(shí)是否完成 }, /** * 組件的方法列表 */ methods: { startCountdown() { const lastTime = this.initTime(this.properties.expireTime); if (lastTime > interval) { this.defaultFormat(lastTime); this.setData({ isCountOver: true, lastTime, }); this.tick(); } }, //默認(rèn)處理時(shí)間格式 defaultFormat(time) { const days = 60 * 60 * 1000 * 24; const hours = 60 * 60 * 1000; const minutes = 60 * 1000; const d = Math.floor(time / days); const h = Math.floor((time % days) / hours); const m = Math.floor((time % hours) / minutes); const s = Math.floor((time % minutes) / 1000); this.setData({ d: this.fixedZero(d), h: this.fixedZero(h), m: this.fixedZero(m), s: this.fixedZero(s), }); }, //定時(shí)事件 tick() { let { lastTime } = this.data; this.timer = setTimeout(() => { clearTimeout(this.timer); if (lastTime < interval) { this.setData({ lastTime: 0, isCountOver: false, }); } else { lastTime -= 1000; this.setData( { lastTime, }, () => { this.defaultFormat(lastTime); this.tick(); }, ); } }, interval); }, //初始化時(shí)間 initTime(expireTime) { let lastTime = Number(new Date(expireTime * 1000)) - new Date().getTime(); console.log('lastTime', lastTime); return Math.max(lastTime, 0); }, // 格式化時(shí)間加0 fixedZero(val) { return val < 10 ? `0${val}` : val; }, }, });
遇到相關(guān)變量,自己更改即可
到此這篇關(guān)于小程序?qū)崿F(xiàn)倒計(jì)時(shí)組件的使用示例的文章就介紹到這了,更多相關(guān)小程序 倒計(jì)時(shí)組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實(shí)現(xiàn)函數(shù)重載的代碼示例
在JavaScript中并沒有直接支持函數(shù)重載的機(jī)制,但是可以通過一些技巧來模擬函數(shù)重載的效果,比如使用參數(shù)判斷,使用默認(rèn)參數(shù),對(duì)象參數(shù),這些方法都可以實(shí)現(xiàn)類似函數(shù)重載的效果,所以本文就給大家介紹一下JavaScript如何實(shí)現(xiàn)函數(shù)重載,需要的朋友可以參考下2023-08-08JS實(shí)現(xiàn)圖片點(diǎn)擊后出現(xiàn)模態(tài)框效果
這篇文章主要介紹了JS實(shí)現(xiàn)圖片點(diǎn)擊后出現(xiàn)模態(tài)框效果,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05JS實(shí)現(xiàn)漢字與Unicode碼相互轉(zhuǎn)換的方法詳解
這篇文章主要介紹了JS實(shí)現(xiàn)漢字與Unicode碼相互轉(zhuǎn)換的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了javascript針對(duì)漢字與Unicode編碼轉(zhuǎn)換的操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04關(guān)于JSON解析的實(shí)現(xiàn)過程解析
這篇文章主要介紹了關(guān)于JSON解析的實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10javascript簡(jiǎn)化代碼 A=alert w=document.writeln
建議不要這樣寫代碼,考慮以后的修改才是最重要的,代碼分層.多把一個(gè)功能寫成一個(gè)js代碼或一個(gè)類,然后提供接口,這種寫法代碼會(huì)更多,速度也更慢,但人人都推薦這樣寫,是因?yàn)檫@樣子維護(hù)方便.而程序不可能一次性寫得完美的,永遠(yuǎn)都可以改進(jìn)2008-02-02DLL+ ActiveX控件+WEB頁(yè)面調(diào)用例子
因項(xiàng)目需要,開始學(xué)習(xí)并研究VC、DLL及ActiveX控件,網(wǎng)上資料找了很多,但沒一個(gè)可用的或者說沒一個(gè)例子可理解并運(yùn)行的。沒辦法,自己研究吧。功夫不負(fù)有心人,終有小成了,呵呵,現(xiàn)在把自己學(xué)習(xí)總結(jié)了一下,獻(xiàn)給需要的人。2010-08-08前端百度地圖添加點(diǎn)并跳轉(zhuǎn)到百度地圖進(jìn)行導(dǎo)航完整代碼
web開發(fā)過程中經(jīng)常碰到需要調(diào)用百度地圖來視線定位導(dǎo)航的過程,許多技術(shù)博客上介紹的都是調(diào)用百度地圖的api,這篇文章主要給大家介紹了關(guān)于前端百度地圖添加點(diǎn)并跳轉(zhuǎn)到百度地圖進(jìn)行導(dǎo)航的相關(guān)資料,需要的朋友可以參考下2024-07-07javascript實(shí)現(xiàn)簡(jiǎn)單的鼠標(biāo)拖動(dòng)效果實(shí)例
這篇文章主要介紹了javascript實(shí)現(xiàn)簡(jiǎn)單的鼠標(biāo)拖動(dòng)效果,實(shí)例分析了javascript鼠標(biāo)拖動(dòng)效果的相關(guān)要點(diǎn)與實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04