在專案開發裡,我們經常會遇到傳送驗證碼、點選了之後有60秒倒數計時的按鈕,很常見卻也很簡單,但是在寫這個按鈕的時候有個別地方還要注意下,今天寫出來,如有問題歡迎指正!
完成的效果如下:
為了更快顯示出效果,我把時間設成了5秒。按鈕在點選之後會出現倒數計時,同時按鈕變為不可點選狀態,樣式也發生變化,滑鼠懸浮上的樣子也會發生變化。
接下來我們用程式碼來實現:
<button class="button" @click="countDown">
{{content}}
</button>
...
data () {
return {
content: '傳送驗證碼', // 按鈕裡顯示的內容
totalTime: 60 //記錄具體倒數計時時間
}
},
methods: {
countDown() {
let clock = window.setInterval(() => {
this.totalTime--
this.content = this.total + 's後重新傳送'
},1000)
}
}
複製程式碼
在data里加了兩條資料,一條用來記錄時間,一條用來盛放倒數計時按鈕的具體內容。在countDown函式裡我們用了setInterval定時器,每隔一秒totalTime減1,同時更改按鈕裡顯示的內容。在window.setInterval裡用了箭頭函式,因為它會自動繫結外面的this,所以就不用先存下this了。
效果如下圖:
但是這個按鈕還有一些問題:
- 點選了按鈕之後過了1秒就直接從59秒開始倒數計時了,中間的60不見了
- 倒數計時的時候還可以點選
- 還沒有清除倒數計時
接下來需要繼續完善countDown函式來解決這些問題。
countDown () {
this.content = this.totalTime + 's後重新傳送' //這裡解決60秒不見了的問題
let clock = window.setInterval(() => {
this.totalTime--
this.content = this.totalTime + 's後重新傳送'
if (this.totalTime < 0) { //當倒數計時小於0時清除定時器
window.clearInterval(clock)
this.content = '重新傳送驗證碼'
this.totalTime = 60
}
},1000)
},
複製程式碼
上面的程式碼解決了60不見的問題,同時當totalTime小於0時清除同時器、重新設定按鈕裡的content、將totalTime重置為60以便下次使用。
倒計10秒的效果:
發現bug,多次點選之後,倒講時速度變快,這是因為每次點選都會啟動一個setInterval,這些setInterval都會減少totalTime。解決的方法也很簡單:簡單節流一下就好了,就是第一次點選按鈕之後讓countDonw這個函式的程式碼不可執行,等到倒數計時結束之後才可以再次執行。
data () {
return {
content: '傳送驗證碼',
totalTime: 10,
canClick: true //新增canClick
}
}
...
countDown () {
if (!this.canClick) return //改動的是這兩行程式碼
this.canClick = false
this.content = this.totalTime + 's後重新傳送'
let clock = window.setInterval(() => {
this.totalTime--
this.content = this.totalTime + 's後重新傳送'
if (this.totalTime < 0) {
window.clearInterval(clock)
this.content = '重新傳送驗證碼'
this.totalTime = 10
this.canClick = true //這裡重新開啟
}
},1000)
}
複製程式碼
在data裡新增canClick,預設是true,如果canClick為true,countDown裡的程式碼可以執行,如果是false就不行。每執行一次就將canClick設為false,而只在倒數計時結束的時候再改為true。這樣剛才的問題就沒有了。
到這裡其實就差不多了,不過還可以調整下樣式:
<button class="button" :class="{disabled: !this.canClick}" @click="countDown">
...
.disabled{
background-color: #ddd;
border-color: #ddd;
color:#57a3f3;
cursor: not-allowed; // 滑鼠變化
}
複製程式碼
效果:
這個倒數計時按鈕十分簡單,但是我第一次寫的時候還是寫的很亂,而且那個時候還不知道函式節流的概念,也不清楚多次點選為啥倒數計時會變快,現在理解了寫在這裡。如果還有什麼不足,還希望大家多多批評指正!
這是我在掘金寫的第六篇文章,感謝您的觀看!