溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

微信小程序倒計(jì)時(shí)組件怎么用

發(fā)布時(shí)間:2022-03-10 10:02:48 來源:億速云 閱讀:278 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“微信小程序倒計(jì)時(shí)組件怎么用”,在日常操作中,相信很多人在微信小程序倒計(jì)時(shí)組件怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”微信小程序倒計(jì)時(shí)組件怎么用”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

微信小程序倒計(jì)時(shí)組件怎么用

重構(gòu)舊代碼

在原來的組件中有一個(gè)initDuration屬性和3個(gè)方法,3個(gè)方法分別是countDown,format和runCountDown。

initDuration屬性

首先我們需要三個(gè)page屬性來幫助完成接下來的代碼,它們的名字和內(nèi)容如下:

timer: null, // 存儲(chǔ)setInterval的ID
flag: false, // 倒計(jì)時(shí)是否結(jié)束的標(biāo)志
num: 0 // 過去的秒數(shù)
復(fù)制代碼

在initDuration屬性的新的回調(diào)方法中,我們封裝了clearTimer方法,init初始化方法,并且執(zhí)行倒計(jì)時(shí)。

initDuration: {
  type: Number,
  value: 0,
  observer: function (newVal) {
    if (this.timer) {
      this.clearTimer()
    }
  
    this.init() // 重置num和flag
    this.runCountDown(newVal)
  }
},
復(fù)制代碼

一定要注意,當(dāng)傳入的屬性的值為默認(rèn)值,例如這里是0時(shí),是不會(huì)觸發(fā)observer回調(diào)的。

/**
 * 初始化函數(shù)
 */
init: function () {
  this.flag = false
  this.num = 0
}

/**
 * 清空計(jì)時(shí)器
 */
clearTimer: function () {
  clearInterval(this.timer)
  this.timer = null
}
復(fù)制代碼

countDown方法

countDown方法是接受一個(gè)參數(shù)為倒計(jì)時(shí)的秒數(shù),返回一個(gè)倒計(jì)時(shí)的字符串。在這個(gè)方法中沒有太大改動(dòng),只是改動(dòng)了一些代碼格式。如下:

/**
 * 計(jì)算倒計(jì)時(shí)
 * @param {Number} duration - 秒數(shù)時(shí)間差
 * @returns {string} 倒計(jì)時(shí)的字符串
 */
countDown: function (duration) {
  if (duration <= 0) {
    this.setFlag(true) // 將flag屬性設(shè)為true
    return '00:00:00' // 返回默認(rèn)時(shí)間設(shè)置
  }

  let seconds = this._format(duration % 60)
  let minutes = Math.floor(duration / 60)
  minutes = minutes >= 60 ? this._format(minutes % 60) : this._format(minutes)
  let hours = this._format(Math.floor(duration / 3600))

  return `${hours}:${minutes}:${seconds}`
},
復(fù)制代碼

format方法

format方法的作用很簡(jiǎn)單,就是處理小于10的數(shù)字展示問題。

/**
 * 格式化小于10的數(shù)字
 * @param {Number} time - 小于10的數(shù)字
 * @returns {string} 格式化后的字符串
 */
format: function (time) {
  return time >= 10 ? time : `0${time}`
},
復(fù)制代碼

runCountDown方法

runCountDown方法中的改動(dòng)比較大,在原來的代碼中邏輯比較混亂,穿插了許多無關(guān)的代碼,其實(shí)應(yīng)該將它們封裝起來達(dá)到解耦的目的。

runCountDown: function (initDuration) {
  // 第一次給倒計(jì)時(shí)賦值 this.setData({ countDownStr })
  this.setCountDownTime(this.countDown(initDuration))

  // 每一秒更新一次倒計(jì)時(shí)
  this.timer = setInterval(() => {
    if (this.flag == true) { // 倒計(jì)時(shí)結(jié)束
      clearInterval(this.timer)

      return undefined
    }

    this.addNum() // this.num += 1
    this.setCountDownTime(this._countDown(initDuration - this.num))
  }, 1000)
},
復(fù)制代碼

增加新功能

我們?cè)瓉淼牡褂?jì)時(shí)組件是缺乏一些功能的,例如傳入的時(shí)間只能是秒數(shù),倒計(jì)時(shí)結(jié)束后只顯示00:00:00,如果傳入的值是0的話會(huì)不進(jìn)行初始化(這算是Bug了)。所以我們需要加入以下的新功能:

  • 支持自定義倒計(jì)時(shí)結(jié)束后現(xiàn)實(shí)的字符串。

  • 修復(fù)傳入值為0的Bug。

  • 傳入的時(shí)間可以是秒數(shù),也可以是UTC時(shí)間的字符串。

自定義結(jié)束字符串

在倒計(jì)時(shí)組件中,展示倒計(jì)時(shí)字符串的是this.data.countDownTime屬性。所以在結(jié)束時(shí)將countDownTime屬性的值設(shè)為傳入的字符串即可。 首先,封裝一個(gè)賦值方法

setEndContent: function (countDownTime) {
  if (countDownTime) {
    this.setData({ countDownTime })
  }
}
復(fù)制代碼

接下來為組件新增加一個(gè)屬性為 endContent 。

endContent: {
  type: String,
  value: '00:00:00'
}
復(fù)制代碼

接下來,在倒計(jì)時(shí)結(jié)束的位置,調(diào)用我們的賦值方法,也就是runCountDown方法的計(jì)時(shí)器回調(diào)函數(shù)中。

this.timer = setInterval(() => {
  if (this.flag == true) {
    clearInterval(this.timer)
    
    this.setEndContent(this.properties.endContent) // 設(shè)置結(jié)束字符串
    
    return undefined
  }
    
  this.addNum()
  this.setCountDownTime(this._countDown(initDuration - this.num))
}, 1000)
復(fù)制代碼

這樣自定義字符串就成功了,在使用組件時(shí)傳入默認(rèn)值即可。

修復(fù)傳入值為0的Bug

這個(gè)問題的出現(xiàn)是因?yàn)楫?dāng)傳入屬性為默認(rèn)值時(shí),不會(huì)調(diào)用observer回調(diào)函數(shù),所以這時(shí)我們需要使用組件的 attached 生命周期函數(shù)。

attached: function () {
  if (this.properties.initDuration <= 0) {
    // 如果傳入值為零時(shí)不會(huì)調(diào)用observer回調(diào),則直接從這里展示倒計(jì)時(shí)結(jié)束
    this.setEndContent(this.properties.endContent)
  }
}
復(fù)制代碼

可以傳入U(xiǎn)TC時(shí)間字符串

為了簡(jiǎn)潔起見,我們就不為組件增加新的屬性了,依然使用initDuration屬性,所以要將其type從Number改為null(小程序的這點(diǎn)不夠強(qiáng),不能選擇多類型。)。在修改type后我們需要封裝一個(gè)將UTC時(shí)間字符串解析成倒計(jì)時(shí)秒數(shù)的方法。

parseDate: function (date) {
  if (typeof date == 'string') {
    // 將傳進(jìn)來的時(shí)間減去現(xiàn)在的時(shí)間,得到的結(jié)果便和直接傳進(jìn)數(shù)字值相同
    return Math.floor((+new Date(date) / 1000)) - Math.floor((+new Date / 1000))
  }
  
  return date
}
復(fù)制代碼

在observer回調(diào)中調(diào)用時(shí)如下:

initDuration: {
  type: null,
  observer: function (newVal) {
    if (this.timer) {
      this._clearTimer()
    }
  
    this._init()
    this._runCountDown(this.parseDate(newVal)) // 在這里調(diào)用parseData方法
  }
}
復(fù)制代碼

到此,關(guān)于“微信小程序倒計(jì)時(shí)組件怎么用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI