<template>
<div id="splitContainer" ref="itemRef">
<span v-for="(item,index) in valueArr" :key="index">
<el-input
class="splitInput"
maxlength="4"
v-model="item.value"
@input="onChange($event,index)"
@keyup="onControl($event,index)"
@keydown="onControl($event,index)"
:ref="(el)=>setItemRef(el, index)"
/>
<span class="separate" v-if="!(index === props.inputNum - 1)">-</span>
</span>
</div>
</template>
<script setup>
import { ref,nextTick,onMounted } from 'vue'
/* 接收父组件传来的值 */
const props = defineProps({
inputNum:{/* input的数量,每个input只允许输入4位 */
type:Number
},
code:{
type:String
}
})
let message = ref()
const emit = defineEmits(['update:code'])
/* 用于存放渲染input的value */
let valueArr = ref([])
const itemRef = ref({})
/* 返回父组件的值 */
let returnValue = ''
for(var i = 0 ;i<props.inputNum;i++){
valueArr.value.push({
value:props.code.slice(i*4,i*4+4)
})
}
const setItemRef = function(el, key){
itemRef.value[key] = el
}
const onChange = function(e,index){
mergeValue()
emit('update:code', returnValue)
}
const onControl = function(e,index){
// 获取键盘控制事件:Backspace、ArrowLeft、ArrowRight
switch (e.code) {
case "Backspace":
if (valueArr.value[index].value === '') {
mergeValue()
if (index === 0) {
return
}
nextTick(() => {
itemRef.value[(index - 1)].focus()
})
}
break
case "ArrowLeft":
if (index === 0) return
if (e.srcElement.selectionStart === 0) {
nextTick(() => {
itemRef.value[(index - 1)].focus()
})
}
break
case "ArrowRight":
if (index == props.inputNum-1) {
return
}
if (e.srcElement.selectionStart === e.srcElement.value.length) {
nextTick(() => {
itemRef.value[(index + 1)].focus()
})
}
break
default:
if (index == props.inputNum-1) {
return
}
if(valueArr.value[index].value.length === 4){
if (e.srcElement.selectionStart === e.srcElement.value.length) {
nextTick(() => {
itemRef.value[(index + 1)].focus()
})
}
}
}
}
/* 拼接valueArr的值 */
const mergeValue = function(){
returnValue = ''
for(var i = 0 ;i<valueArr.value.length;i++){
returnValue += valueArr.value[i].value
}
}
/* 添加粘贴事件 */
onMounted(()=>{
document.getElementById('splitContainer').addEventListener('paste',function(event){
let pasteValue = (event.clipboardData || window.clipboardData).getData('text').trim();
if(pasteValue.length == props.inputNum*4){
/* 禁止默认事件 */
event.preventDefault();
for(var j = 0 ; j < 4 ; j++){
valueArr.value[j].value = pasteValue.slice(j*4,j*4+4);
}
onChange()
}
})
})
</script>
<style scoped>
#splitContainer{
width: 100%;
margin: 5rem auto;
}
.splitInput{
width: 10rem;
}
.separate{
/* float: right; */
margin: auto 0.5rem;
line-height: 25px;
}
:deep(.el-input__inner){
text-align: center;
}
:deep(.el-input__inner){
font-size: 1rem;
}
:deep(.el-button){
font-size: 1rem;
}
</style>
简易激活码输入框组件
最新推荐文章于 2024-08-15 16:36:19 发布
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
ACE-Step
音乐合成
ACE-Step
ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言
9794





