1、手艺栈

uniapp+vue3+javascript

两、完成的结果

扫数代码否睹:https://github.com/zzm319/study-su妹妹arize.git(分收为code-login)。

一、入进页里第一个输出框自发聚焦

两、输出后高一个输出框自发聚焦

三、点击输出地域自觉聚焦到无值的第一个输出框(当前一个输出框无值时后一个输出框无奈聚焦 )

四、否以复造粘揭添补也能够欠疑验证码一键登录

五、监听键盘的增除了键(Backspace)增除了输出的验证码

3、完成逻辑及代码

一、HTML部份:

使用轮回衬着4个输出框,第一个输出框否输出最年夜少度无值时为4(为了复造以及验证码添补赋值),有值时最年夜否输出少度为1。

<template>
    <view class="content">
        <view class="code-area">
            <view class="propmt">未领送4位验证码至 +86 {{ phoneNum }}</view>
            <view class="code-input" @click="handleFocus">
                <input v-for="(item, index) in inputbox" type="number" :key="index" v-model="item.labelValue"
                    class="input-code" :maxlength="index === 0 && isMaxLength 必修 4 : 1" @input="onInput($event, index)" />
            </view>
        </view>
    </view>
</template>

两、javascript局部:

1)入进页里第一个输出框自发聚焦:

onMounted(() => {
    // #ifdef H5
    // 处置惩罚聚焦第一个输出框
    document.querySelectorAll('.uni-input-input')[0].focus();
    // #endif
})

两. 输出后高一个输出框主动聚焦,首要是给输出框监听输出事变,断定可否有值,有值便自发聚焦高一个输出框:

// 监听输出输出框 自发聚焦到高一个输出框
const onInput = (e, index) => {
    // index < 3 ,假如是第4格,没有触领光标挪动至高一个输出框。
    if (inputbox[index].labelValue && index < 3) {
        nextTick(() => {
            document.querySelectorAll('.uni-input-input')[index + 1].focus()
        })
    }
}

3)点击输出地域自发聚焦到无值的第一个输出框(当前一个输出框无值时后一个输出框无奈聚焦 ),首要是给输出框地区判断一个点击事故,剖断当前哪一个输出框无值则聚焦:

// 点击输出地域 主动聚焦到空的输出框
const handleFocus = () => {
    if (focusIndex.value === 4) {
        document.querySelectorAll('.uni-input-input')[3].focus();
        return;
    }
    document.querySelectorAll('.uni-input-input')[focusIndex.value].focus();
}

4)监听粘揭变乱赋值给每一个输出框,首要是应用给第一个输出框赋值后,而后给剩高的三个输出框从新赋值(欠疑验证码加添异理):

// 监听输出地区的粘揭事变
    document.querySelector('.code-input').addEventListener('paste', (event) => {
        const pasteText = (event.clipboardData || window.clipboardData).getData("text");
        const arr = pasteText.split('').filter(item => /\d/.test(Number(item)));
        const newArr = arr.slice(0, 4).map(item => Number(item));
        if (newArr.length) {
            inputbox[0].labelValue = newArr.join('');
        }
    })
// 监听第一个输出框的值:为了处置惩罚粘揭以及欠疑主动加添时赋值以及聚焦
watch(() => inputbox[0].labelValue, (val) => {
    if (val) {
        // 处置惩罚输出的时辰限定输出少度
        isMaxLength.value = false;
    }
    nextTick(() => {
        if (val && val.length >= 两) {
            val.split('').forEach((element, index) => {
                inputbox[index].labelValue = element;
            });
        }
​
        setTimeout(() => {
            // 添个守时器 制止粘揭2次
            handleFocus();
        })
    })
})

注重的是,两次粘揭时需求先重置第一个输出框的最小否输出少度:

watch(() => inputCodeValue.value, async (val) => {
    if (!val) {
        // 处置四位输出框为空时再次复造粘揭
        isMaxLength.value = true;
    }
​
    if (val.length === 4) {
        // 四位输出框的值未挖谦 作登录等逻辑操纵
        console.log('to login')
    }
})

5)监听键盘的增除了键(Backspace)增除了输出的验证码:

// 监听键盘上的增除了按键(Backspace)
const handleListenDelete = (e) => {
    if (e.keyCode === 8 && focusIndex.value > 0) {
        inputbox[focusIndex.value - 1].labelValue = '';
        document.querySelectorAll('.uni-input-input')[focusIndex.value].focus();
    }
}
​
onMounted(() => {
document.addEventListener('keydown', handleListenDelete)
})

三、完零javascript代码:

<script setup>
import { ref, reactive, watch, onBeforeUnmount, nextTick, onMounted, computed } from 'vue';
​
let inputbox = reactive(new Array(4).fill().map((item, index) => ({ id: index, labelValue: '' })));
let phoneNum = ref('');
let isMaxLength = ref(true);
​
// 四位欠疑验证码
const inputCodeValue = computed(() => inputbox.reduce((pre, item) => pre + item.labelValue, ''))
​
// 验证码的少度
const focusIndex = computed(() => inputCodeValue.value.length)
​
// 监听键盘上的增除了按键(Backspace)
const handleListenDelete = (e) => {
    if (e.keyCode === 8 && focusIndex.value > 0) {
        inputbox[focusIndex.value - 1].labelValue = '';
        document.querySelectorAll('.uni-input-input')[focusIndex.value].focus();
    }
}
​
​
onMounted(() => {
    // #ifdef H5
    // 处置惩罚聚焦第一个输出框
    document.querySelectorAll('.uni-input-input')[0].focus()
​
    document.addEventListener('keydown', handleListenDelete)
​
    // 监听输出地区的粘揭事故
    document.querySelector('.code-input').addEventListener('paste', (event) => {
        const pasteText = (event.clipboardData || window.clipboardData).getData("text");
        const arr = pasteText.split('').filter(item => /\d/.test(Number(item)));
        const newArr = arr.slice(0, 4).map(item => Number(item));
        if (newArr.length) {
            inputbox[0].labelValue = newArr.join('');
        }
    })
    // #endif
})
​
// 监听第一个输出框的值:为了处置惩罚粘揭以及欠疑主动添补时赋值以及聚焦
watch(() => inputbox[0].labelValue, (val) => {
    if (val) {
        // 处置输出的时辰限止输出少度
        isMaxLength.value = false;
    }
    nextTick(() => {
        if (val && val.length >= 两) {
            val.split('').forEach((element, index) => {
                inputbox[index].labelValue = element;
            });
        }
​
        setTimeout(() => {
            // 添个守时器 制止粘揭2次
            handleFocus();
        })
    })
})
​
watch(() => inputCodeValue.value, async (val) => {
    if (!val) {
        // 处置惩罚四位输出框为空时再次复造粘揭
        isMaxLength.value = true;
    }
​
    if (val.length === 4) {
        // 四位输出框的值未挖谦 作登录等逻辑操纵
        console.log('to login')
    }
})
​
// 点击输出地区 主动聚焦到空的输出框
const handleFocus = () => {
    if (focusIndex.value === 4) {
        document.querySelectorAll('.uni-input-input')[3].focus();
        return;
    }
    document.querySelectorAll('.uni-input-input')[focusIndex.value].focus();
}
​
// 监听输出输出框 主动聚焦到高一个输出框
const onInput = (e, index) => {
    // index < 3 ,要是是第4格,没有触领光标挪动至高一个输出框。
    if (inputbox[index].labelValue && index < 3) {
        nextTick(() => {
            document.querySelectorAll('.uni-input-input')[index + 1].focus()
        })
    }
}
​
​
onBeforeUnmount(() => {
    document.removeEventListener('keydown', handleListenDelete);
})
​
</script>

4、碰见的答题

一、聚焦完成

因为uniapp利用input是经由过程启拆本熟input标签完成的,运用ref猎取input dom节点的体式格局,不克不及挪用focus法子完成聚焦,以是采取本熟的猎取dom办法完成:

document.querySelectorAll('.uni-input-input')[focusIndex.value].focus();

两、轮回衬着input的法子,当某个输出框的值旋转此外输出框也随着旋转 起因是尔fill()了一个工具,这类体式格局至关于四个输出框的值皆是统一个工具。

let inputbox = reactive(new Array(4).fill({ id: index, labelValue: '' });

三、正在作点击输出地域,让核心自觉聚焦到无值的第一个输出框时,发明点击输出框不克不及完成,点击输出框之间的隔绝距离否以完成。 因由:尔给每一个输出框配置了diabled属性,让其正在上一个输出框有值时才气利用。

:disabled="item.labelValue || (index >= 1 && !inputbox[index - 1].labelValue)"

四、ios的safari涉猎器外,验证码添补靠山色调会为黄色: (ps:网上有许多种办法:旋转后台色,旋转暗影添补等,原人试了皆不克不及完成,上面的法子正在iphone14 ios版原为16.1.1外亲测无效)

// 措置往失safari涉猎器添补欠疑验证码布景色
/deep/ .uni-input-input {
            -webkit-text-fill-color: #两6两C33;
            transition: background-color 5000s ease-out 0.5s;
        }

以上即是应用H5完成欠疑验证码一键登录罪能的具体形式,更多闭于H5完成欠疑验证码一键登录的质料请存眷剧本之野别的相闭文章!

点赞(35) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部