日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

vue 实现动态增加输入框_vue实现一个6个输入框的验证码输入组件

發布時間:2025/3/20 vue 82 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue 实现动态增加输入框_vue实现一个6个输入框的验证码输入组件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

要實現的功能:

完全和單輸入框一樣的操作,甚至可以插入覆蓋:

1,限制輸入數字

2,正常輸入

3,backspace刪除

4,paste任意位置粘貼輸入

5,光標選中一個數字,滾輪可以微調數字大小,限制0-9

6,123|456 自動覆蓋光標后輸入的字符,此時光標在3后,繼續輸入111,會得到123111,而不用手動刪除456

7,封裝成vue單文件組件,方便任意調用。

模板代碼

<template><div class="input-box"><div class="input-content" @keydown="keydown" @keyup="keyup" @paste="paste" @mousewheel="mousewheel"@input="inputEvent"><input max="9" min="0" maxlength="1" data-index="0" v-model.trim.number="input[0]" type="number"ref="firstinput"/><input max="9" min="0" maxlength="1" data-index="1" v-model.trim.number="input[1]" type="number"/><input max="9" min="0" maxlength="1" data-index="2" v-model.trim.number="input[2]" type="number"/><input <input max="9" min="0" maxlength="1" data-index="4" v-model.trim.number="input[4]" type="number"/><input max="9" min="0" maxlength="1" data-index="5" v-model.trim.number="input[5]" type="number"/></div></div> </template>

<input max="9" min="0" maxlength="1" data-index="1" v-model.trim.number="input[1]" type="number"/>

<input max="9" min="0" maxlength="1" data-index="2" v-model.trim.number="input[2]" type="number"/>

<input

<input max="9" min="0" maxlength="1" data-index="4" v-model.trim.number="input[4]" type="number"/>

<input max="9" min="0" maxlength="1" data-index="5" v-model.trim.number="input[5]" type="number"/>

</div>

</div>

</template>

實現了鍵盤的keydown/keyup/paste/input和鼠標滾輪mousewheel事件

使用了6個輸入框的方案來實現。

樣式部分:使用了scss模式

<style scoped lang="scss">.input-box {.input-content {width: 512px;height: 60px;display: flex;align-items: center;justify-content: space-between;input {color: inherit;font-family: inherit;border: 0;outline: 0;border-bottom: 1px solid #919191;height: 60px;width: 60px;font-size: 44px;text-align: center;}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button {appearance: none;margin: 0;}} </style>

具體實現邏輯:主要實現以上幾個鍵盤事件操作。

<script>export default {data() {return {pasteResult: [],};},props: ['code'],computed: {input() {if (this.code && Array.isArray(this.code) && this.code.length === 6) {return this.code;} else if (/^d{6}$/.test(this.code.toString())) {return this.code.toString().split('');} else if (this.pasteResult.length === 6) {return this.pasteResult;} else {return new Array(6);}}},methods: {// 解決一個輸入框輸入多個字符inputEvent(e) {var index = e.target.dataset.index * 1;var el = e.target;el.value = el.value.replace(/Digit|Numpad/i, '').replace(/1/g, '').slice(0, 1);this.$set(this.input, index, el.value)},keydown(e) {var index = e.target.dataset.index * 1;var el = e.target;if (e.key === 'Backspace') {if (this.input[index].length > 0) {this.$set(this.input, index, '')} else {if (el.previousElementSibling) {el.previousElementSibling.focus()this.$set(this.input, index - 1, '')}}} else if (e.key === 'Delete') {if (this.input[index].length > 0) {this.$set(this.input, index, '')} else {if (el.nextElementSibling) {this.$set(this.input, index = 1, '')}}if (el.nextElementSibling) {el.nextElementSibling.focus()}} else if (e.key === 'Home') {el.parentElement.children[0] && el.parentElement.children[0].focus()} else if (e.key === 'End') {el.parentElement.children[this.input.length - 1] && el.parentElement.children[this.input.length - 1].focus()} else if (e.key === 'ArrowLeft') {if (el.previousElementSibling) {el.previousElementSibling.focus()}} else if (e.key === 'ArrowRight') {if (el.nextElementSibling) {el.nextElementSibling.focus()}} else if (e.key === 'ArrowUp') {if (this.input[index] * 1 < 9) {this.$set(this.input, index, (this.input[index] * 1 + 1).toString());}} else if (e.key === 'ArrowDown') {if (this.input[index] * 1 > 0) {this.$set(this.input, index, (this.input[index] * 1 - 1).toString());}}},keyup(e) {var index = e.target.dataset.index * 1;var el = e.target;// 解決輸入e的問題el.value = el.value.replace(/Digit|Numpad/i, '').replace(/1/g, '').slice(0, 1);if (/Digit|Numpad/i.test(e.code)) {// 必須在這里符直,否則輸入框會是空值this.$set(this.input, index, e.code.replace(/Digit|Numpad/i, ''));el.nextElementSibling && el.nextElementSibling.focus();if (index === 5) {if (this.input.join('').length === 6) {document.activeElement.blur();this.$emit('complete', this.input);}}} else {if (this.input[index] === '') {this.$set(this.input, index, '');}}},mousewheel(e) {var index = e.target.dataset.index;if (e.wheelDelta > 0) {if (this.input[index] * 1 < 9) {this.$set(this.input, index, (this.input[index] * 1 + 1).toString());}} else if (e.wheelDelta < 0) {if (this.input[index] * 1 > 0) {this.$set(this.input, index, (this.input[index] * 1 - 1).toString());}} else if (e.key === 'Enter') {if (this.input.join('').length === 6) {document.activeElement.blur();this.$emit('complete', this.input);}}},paste(e) {// 當進行粘貼時e.clipboardData.items[0].getAsString(str => {if (str.toString().length === 6) {this.pasteResult = str.split('');document.activeElement.blur();this.$emit('complete', this.input);this.pasteResult = [];} else {// 如果粘貼內容不合規,清除所有內容this.input[0] = new Array(6)}})}},mounted() {// 等待dom渲染完成,在執行focus,否則無法獲取到焦點this.$nextTick(() => {this.$refs.firstinput.focus()})},} </script>

如果你發現了bug,或者有優化空間,歡迎你的指正和建議。我會隨時更新到原代碼當中,分享給大家。

作者:jsoncode

鏈接:人類身份驗證 - SegmentFault

來源:SegmentFault 思否社區

總結

以上是生活随笔為你收集整理的vue 实现动态增加输入框_vue实现一个6个输入框的验证码输入组件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。