uniapp中如何基于vue3實(shí)現(xiàn)輸入驗(yàn)證碼功能
實(shí)現(xiàn)效果

描述
使用uniapp和vue3實(shí)現(xiàn)了手機(jī)獲取驗(yàn)證碼后,輸入驗(yàn)證碼的輸入框功能
具體實(shí)現(xiàn)代碼
下述代碼為實(shí)現(xiàn)驗(yàn)證碼輸入框封裝的組件VerificationCodeInput.vue
<template>
<view class="container">
<view class="input-container">
<view v-for="index in 4" :key="index" class="verify-input">
<input
type="number"
class="input-field"
:ref="`input${index - 1}`"
:maxlength="1"
:focus="focusIndex === index - 1"
@input="handleInput(index - 1, $event)"
@focus="handleFocus(index - 1)"
/>
</view>
</view>
</view>
</template>
<script lang="ts" setup>
import { ref, onMounted, nextTick } from 'vue'
// 焦點(diǎn)索引
const focusIndex = ref(0)
// 輸入值數(shù)組
const values = ref<string[]>(['', '', '', ''])
// 輸入框ref數(shù)組
const inputRefs = ref<(HTMLInputElement | null)[]>([])
/**
* 處理每個(gè)輸入值函數(shù)
* @param index - 序號(hào).
* @param event - 輸入事件對(duì)象.
*/
const handleInput = (index: number, event: Event) => {
// 獲取輸入框的值
const input = event.target as HTMLInputElement
const value = input.value
if (value) {
// 更新輸入值數(shù)組
values.value[index] = value
// 判斷是否還有下一個(gè)輸入框,如果有則聚焦
if (index < 3) {
nextTick(() => {
focusIndex.value = index + 1
const nextInput = inputRefs.value[index + 1]
nextInput?.focus()
})
}
// 判斷是否所有輸入框都已經(jīng)有值,如果有則觸發(fā)完成事件
if (values.value.every((v) => v.length > 0)) {
handleComplete()
}
} else {
// 如果輸入值為空,則聚焦前一個(gè)輸入框
if (index > 0) {
focusIndex.value = index - 1
nextTick(() => {
const prevInput = inputRefs.value[index - 1]
prevInput?.focus()
})
}
}
}
// 處理焦點(diǎn)事件
const handleFocus = (index: number) => {
focusIndex.value = index
}
// 處理完成事件
const handleComplete = () => {
const code = values.value.join('')
console.log('驗(yàn)證碼輸入完成:', code)
}
onMounted(() => {
// 初始化焦點(diǎn)
nextTick(() => {
const firstInput = inputRefs.value[0]
firstInput?.focus()
})
})
</script>
<style>
.input-container {
display: flex;
justify-content: space-between;
}
.verify-input {
width: 60px;
height: 60px;
display: flex;
justify-content: center;
align-items: center;
}
.input-field {
width: 100%;
height: 100%;
text-align: center;
font-size: 24px;
border: none;
border-bottom: 2px solid #ccc;
outline: none;
}
</style>最后在父組件中引入VerificationCodeInput.vue即可實(shí)現(xiàn)上圖效果

到此這篇關(guān)于uniapp中基于vue3實(shí)現(xiàn)輸入驗(yàn)證碼功能的文章就介紹到這了,更多相關(guān)vue3輸入驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3中reactive的對(duì)象清空所引發(fā)的問(wèn)題解決方案(清空不了和清空之后再去賦值就賦值不了)
在使用reactive定義的變量時(shí),直接賦值會(huì)失去響應(yīng)式,為了清空?filters并確保響應(yīng)式,可以使用Object.assign({},?filters)或者遍歷對(duì)象逐個(gè)清除屬性,本文介紹vue3中reactive的對(duì)象清空所引發(fā)的問(wèn)題解決方案(清空不了和清空之后再去賦值就賦值不了),感興趣的朋友一起看看吧2025-02-02
vue?批量自動(dòng)引入并注冊(cè)組件或路由實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了vue?批量自動(dòng)引入并注冊(cè)組件或路由實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Vue項(xiàng)目中解決數(shù)字精度丟失問(wèn)題
我們知道,浮點(diǎn)類型的數(shù)據(jù),在計(jì)算機(jī)中是以二進(jìn)制的方式存儲(chǔ)的,但是表示的數(shù)據(jù)也有個(gè)上限和下限,當(dāng)超過(guò)限制?,在計(jì)算機(jī)上顯示只能取最接近的限值,?數(shù)字解析精度丟失說(shuō)的就是這個(gè)現(xiàn)象,所以本文給大家介紹了Vue項(xiàng)目中解決數(shù)字精度丟失問(wèn)題的解決,需要的朋友可以參考下2024-02-02
Vue中emit事件無(wú)法觸發(fā)的問(wèn)題及解決
這篇文章主要介紹了Vue中emit事件無(wú)法觸發(fā)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
vue+axios+promise實(shí)際開(kāi)發(fā)用法詳解
這篇文章主要介紹了vue+axios+promise實(shí)際開(kāi)發(fā)用法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
vue3中單文件組件<script?setup>實(shí)例詳解
<script?setup>是vue3中新引入的語(yǔ)法糖,目的是簡(jiǎn)化使用Composition?API時(shí)冗長(zhǎng)的模板代碼,下面這篇文章主要給大家介紹了關(guān)于vue3中單文件組件<script?setup>的相關(guān)資料,需要的朋友可以參考下2022-07-07
如何使用Vue mapState快捷獲取Vuex state多個(gè)值
這篇文章主要為大家介紹了如何使用Vue mapState快捷獲取Vuex state多個(gè)值實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
vue.js 打包時(shí)出現(xiàn)空白頁(yè)和路徑錯(cuò)誤問(wèn)題及解決方法
這篇文章主要介紹了vue.js 打包時(shí)出現(xiàn)空白頁(yè)和路徑錯(cuò)誤問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06

