Vue3?實現(xiàn)驗證碼倒計時功能
更新時間:2023年01月07日 11:16:02 作者:貝塔-突突
這篇文章主要介紹了Vue3?實現(xiàn)驗證碼倒計時功能,倒計時的運用場景是獲取手機驗證碼倒計時、獲取郵箱驗證碼倒計時等場景,本文結(jié)合示例代碼給大家詳細講解,需要的朋友可以參考下
前言
倒計時的運用場景:獲取手機驗證碼倒計時、獲取郵箱驗證碼倒計時等場景,廢話不多說,開始吧。
之前給大家介紹過Vue3 實現(xiàn)驗證碼倒計時功能(刷新保持狀態(tài)),需要的朋友點擊查看。
實現(xiàn)效果


實現(xiàn)代碼 html(重要部分)
<template>
<el-button v-if="!sms.disabled" color="#f38301" type="default" @click="send"><span style="color:#eed2b0;">發(fā)送驗證碼</span></el-button>
<el-button v-else type="default" color="#f38301" disabled><span style="color:#eed2b0;">{{ sms.count }} 秒后重新發(fā)送</span></el-button>
</template>js(重要部分)
<script lang="ts" setup>
// 驗證碼計時器
const sms = reactive({
disabled: false,
total: 60,
count: 0
})
// 計時器處理器
const timerHandler = () => {
sms.count = sms.total
sms.disabled = true
let timer = setInterval(() => {
if (sms.count > 1 && sms.count <= sms.total) {
sms.count--
} else {
sms.disabled = false
clearInterval(timer)
}
}, 1000)
}
// 推送
const send = () => {
if (formLabelAlign.username === '') {
ElMessage.error("電子郵件為空")
} else {
// 計時器處理器
timerHandler()
// 加載ui
const loadingInstance1 = ElLoading.service({fullscreen: true})
// api 請求
return emailRegisterApi(formLabelAlign.username).then(res => {
// 關(guān)閉加載
loadingInstance1.close()
}).catch(() => {
// 關(guān)閉加載
loadingInstance1.close()
})
}
</script>
完整代碼
<template>
<div class="email-main">
<div class="email-content">
<div class="email-title">
<h3>注冊報名</h3>
</div>
<div class="email-step">
<el-steps :active="active" finish-status="success" align-center="true">
<el-step title="郵箱注冊" />
<el-step title="填寫報名信息" />
<el-step title="完成" />
</el-steps>
</div>
<div class="email-table">
<el-form
ref="formRef"
label-position="right"
:model="formLabelAlign"
style="width: 460px"
label-width="100px"
size="default"
>
<el-form-item prop="username" label="郵箱賬號">
<el-input v-model="formLabelAlign.username" />
</el-form-item>
<el-form-item prop="region" label="設(shè)置密碼">
<el-input v-model="formLabelAlign.password" />
</el-form-item>
<el-form-item prop="code" label="驗證碼">
<el-input v-model="formLabelAlign.code" />
</el-form-item>
<el-form-item style="margin-left:50px;">
<el-button color="#f38301" @click="submitForm">
<span style="color:#eed2b0;">下一步</span>
</el-button>
<el-button color="#f38301" @click="resetForm(formRef)"> <span style="color: #eed2b0;">重置</span></el-button>
<el-button v-if="!sms.disabled" color="#f38301" type="default" @click="send"><span style="color:#eed2b0;">發(fā)送驗證碼</span></el-button>
<el-button v-else type="default" color="#f38301" disabled><span style="color:#eed2b0;">{{ sms.count }} 秒后重新發(fā)送</span></el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref,reactive } from 'vue'
import { FormInstance, ElLoading, ElMessage } from 'element-plus'
import { emailRegisterApi } from '@/api/facade/facade'
import { useRouter } from 'vue-router'
// 路由
const router = useRouter()
// 步驟標識
const active = ref(0)
// 重置
const formRef = ref<FormInstance>()
// 注冊參數(shù)
const formLabelAlign = reactive({
username: '',
password: '',
code: '',
})
// 驗證碼計時器
const sms = reactive({
disabled: false,
total: 60,
count: 0
})
// 計時器處理器
const timerHandler = () => {
sms.count = sms.total
sms.disabled = true
let timer = setInterval(() => {
if (sms.count > 1 && sms.count <= sms.total) {
sms.count--
} else {
sms.disabled = false
clearInterval(timer)
}
}, 1000)
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
}
// 下一步
const submitForm = () => {
const loadingInstance1 = ElLoading.service({fullscreen: true})
if (formLabelAlign.username != '' && formLabelAlign.password != '' && formLabelAlign.code != '') {
// 跳轉(zhuǎn)到報名頁面
router.push({ path: '/sign_up_info', query: {username: formLabelAlign.username,
password: formLabelAlign.password, code: formLabelAlign.code} })
} else {
ElMessage.warning("請完善全部信息")
}
loadingInstance1.close()
}
const send = () => {
console.log('codeDisabled:',formLabelAlign.username)
if (formLabelAlign.username === '') {
ElMessage.error("電子郵件為空")
} else {
timerHandler()
const loadingInstance1 = ElLoading.service({fullscreen: true})
return emailRegisterApi(formLabelAlign.username).then(res => {
loadingInstance1.close()
}).catch(() => {
ElMessage.error("Email數(shù)據(jù)異常")
loadingInstance1.close()
})
}
}
</script>
<style scoped>
.email-main {
height: 100%;
width: 100%;
position: relative;
}
.email-content {
width: 1200px;
height: 800px;
border: 1px;
position: relative;
left: 400px;
background: #f1f3f5;
}
.email-title {
top: 30px;
position: relative;
left: 570px;
margin-top: 100px;
}
.email-step {
left: 100px;
top: 0px;
position: absolute;
margin-top: 100px;
width: 1000px;
}
.email-table {
left: 350px;
top: 200px;
position: absolute;
}
:deep(.el-step__icon.is-text){
border-radius: 50%;
border: 2px solid #f38301;
background: #f38301;
color: #f1f3f5;
}
</style>PS:Vue3 - 驗證碼按鈕倒計時實現(xiàn)
使用 primevue 作為 UI 框架,沒有按鈕加載(失效)倒計時的配置項。需要自己實現(xiàn)。
setup() {
const btn_vrft = reactive({
label: '獲取驗證碼',
loading: false
});
function countDownTimer(count) {
return new Promise(resolve => {
console.log("Start")
if(count>0){
setTimeout(() => {
count--
countDownTimer(count)
}, 1000)
btn_vrft.label = count.toString()
}
else {
btn_vrft.loading=false
btn_vrft.label='獲取驗證碼'
}
resolve(count)
console.log(count)
console.log("End")
})
};
async function handleVerification(){
btn_vrft.loading=true
await countDownTimer(60)
};
return {
btn_vrft,
handleVerification
}
}按鈕組件:
<Button @click="handleVerification" :label="btn_vrft.label" :loading="btn_vrft.loading" />
到此這篇關(guān)于Vue3 實現(xiàn)驗證碼倒計時的文章就介紹到這了,更多相關(guān)Vue3 驗證碼倒計時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue watch普通監(jiān)聽和深度監(jiān)聽實例詳解(數(shù)組和對象)
這篇文章主要介紹了vue watch普通監(jiān)聽和深度監(jiān)聽(數(shù)組和對象),文中單獨通過代碼給大家介紹了vue watch 深度監(jiān)聽的方法,感興趣的朋友一起看看吧2018-08-08

