Vue3?實現(xiàn)驗證碼倒計時功能(刷新保持狀態(tài))
前言
倒計時的運用場景是需要經(jīng)常用到的,但是根據(jù)業(yè)務(wù)的不同,好比手機驗證碼或者是郵箱驗證碼之類的,即使用戶跳轉(zhuǎn)到其它頁面或者刷新,再次回到登錄也,驗證碼的倒計時也得保持狀態(tài),大家參考邏輯即可,每個人的項目不同,這里提供大概的實現(xiàn)代碼。
代碼實現(xiàn)
主要邏輯
const state = reactive({
labelPosition: 'top',
formData: {
phone: '',
code: '',
},
// 倒計時
countDownTime: 60,
timer: null,
countDownIng: false,
})
const countDown = () => {
let startTime = localStorage.getItem('startTimeLogin');
let nowTime = new Date().getTime();
if (startTime) {
let surplus = 60 - parseInt((nowTime - startTime) / 1000, 10);
state.countDownTime = surplus <= 0 ? 0 : surplus;
} else {
state.countDownTime = 60;
localStorage.setItem('startTimeLogin', nowTime);
}
state.timer = setInterval(() => {
state.countDownTime--;
state.getCodeDisabled = true;
state.countDownIng = true;
if (state.countDownTime <= 0) {
localStorage.removeItem('startTimeLogin');
clearInterval(state.timer);
state.countDownTime = 60;
state.countDownIng = false;
}
}, 1000)
}
onMounted 方法
onMounted(() => {
let sendEndTime = localStorage.getItem('startTimeLogin');
if (sendEndTime) {
state.countDownIng = true;
countDown()
}
})
完整代碼
<template>
<main class="content">
<div class="mi-card login-card">
<div class="reg-form">
<el-form :label-position="labelPosition" label-width="auto" :model="formData">
<el-form-item label="手機號">
<el-input v-model="formData.phone" placeholder="手機號">
<template #append>
<div class="get-code">
<span v-if="!countDownIng" @click="countDown">獲取驗證碼</span>
<span v-if="countDownIng">倒計時{{ countDownTime }}s</span>
</div>
</template>
</el-input>
</el-form-item>
<el-form-item label="驗證碼">
<el-input v-model="formData.code" placeholder="驗證碼"/>
</el-form-item>
<el-form-item>
<span class="sub-btn to-login" style="width: 100%">注冊</span>
</el-form-item>
</el-form>
</main>
</template>
<script>
import {defineComponent, reactive, toRefs, onMounted} from 'vue'
export default defineComponent({
name: "LoginPage",
setup() {
const state = reactive({
labelPosition: 'top',
formData: {
phone: '',
code: '',
},
// 倒計時
countDownTime: 60,
timer: null,
countDownIng: false,
})
/**
* 作者:故藍尋
* 時間:2022/08/05 17:13:37
* 功能:獲取驗證碼 事件
*/
const countDown = () => {
let startTime = localStorage.getItem('startTimeLogin');
let nowTime = new Date().getTime();
if (startTime) {
let surplus = 60 - parseInt((nowTime - startTime) / 1000, 10);
state.countDownTime = surplus <= 0 ? 0 : surplus;
} else {
state.countDownTime = 60;
localStorage.setItem('startTimeLogin', nowTime);
}
state.timer = setInterval(() => {
state.countDownTime--;
state.getCodeDisabled = true;
state.countDownIng = true;
if (state.countDownTime <= 0) {
localStorage.removeItem('startTimeLogin');
clearInterval(state.timer);
state.countDownTime = 60;
state.countDownIng = false;
}
}, 1000)
}
onMounted(() => {
let sendEndTime = localStorage.getItem('startTimeLogin');
if (sendEndTime) {
state.countDownIng = true;
countDown()
}
})
return {
...toRefs(state),
countDown
}
}
})
</script>
<style scoped lang="scss">
</style>
小結(jié)
- 大致邏輯是這樣,大家根據(jù)具體的需要來完善,vue2也適用
- 這是vue3,但是使用的js語法,使用的是ts語法的,也是一樣的邏輯
到此這篇關(guān)于Vue3 驗證碼倒計時實現(xiàn)(刷新保持狀態(tài))的文章就介紹到這了,更多相關(guān)Vue3 驗證碼倒計時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
element組件中自定義組件的樣式不生效問題(vue scoped scss無效)
這篇文章主要介紹了解決element組件中自定義組件的樣式不生效問題(vue scoped scss無效),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
vue實現(xiàn)兄弟組件之間跳轉(zhuǎn)指定tab標(biāo)簽頁
這篇文章主要介紹了vue實現(xiàn)兄弟組件之間跳轉(zhuǎn)指定tab標(biāo)簽頁,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
vue開發(fā)中如何在js文件里使用pinia和組件同步
在JavaScript文件中封裝涉及到使用Pinia的方法時,發(fā)現(xiàn)Pinia和組件內(nèi)容并不同步,二者的狀態(tài)是獨立的,解決辦法是,在新建對象的時候,將Pinia作為參數(shù)傳入,本文給大家介紹vue開發(fā)中如何在js文件里使用pinia和組件同步,感興趣的朋友一起看看吧2024-10-10
淺談vue中$event理解和框架中在包含默認(rèn)值外傳參
這篇文章主要介紹了淺談vue中$event理解和框架中在包含默認(rèn)值外傳參,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
vue結(jié)合Axios+v-for列表循環(huán)實現(xiàn)網(wǎng)易健康頁面(實例代碼)
這篇文章主要介紹了vue結(jié)合Axios+v-for列表循環(huán)實現(xiàn)網(wǎng)易健康頁面,在項目下安裝axios,通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03

