基于vue+element的ip格式输入框组件

需求如下:
(1)输入.时,自动跳入下一输入框;
(2)按下backspace删除键,自动回退到上一输入框
(3)支持任意位置复制、粘贴ip

效果如下:
在这里插入图片描述
代码如下:
父组件:

<template>
    <div class="wrapperBox">
        <ip-input class="m-r10" v-model="ip_ariginal"></ip-input>
        <el-button @click="handleSearch" class="fillUpBtn-blue">搜索</el-button>
    </div>
</template>
<script>
import IpInput from "@/components/ip-input";
export default {
    components: { IpInput },
    data() {
        return {
            ip_ariginal:""
        }
    },
    mounted() {},
    methods: {
        //根据关键字搜索
        handleSearch() {
            let ip_ariginal = this.ip_ariginal;
            if(ip_ariginal!==""){
                let ipList = ip_ariginal.split('.');
                for (let index = 0; index < ipList.length; index++) {
                    if(ipList[index]==null || ipList[index]===""){
                        this.$message.error("请输入完整的IP地址!");
                        return false;
                    }
                }
            }
			
			//宝子们,后面的逻辑代码可根据自己的需求进行自定义补充哈
        }
    }
}
</script>
<style lang='less'></style>

子组件:

<template>
    <div>
        <div class="f-r a-c ipBox">
            <el-input 
            v-model.number="ip1"
            maxlength='3' ref='ip1'
            class="ipInput"
            @paste.native="handlePaste(1,$event)"
            @keyup.native="keyupEvent(1,$event)"
            @blur="submitIp"
            @input="(val) => handleInpIp(val,'ip1')"></el-input>
            <span class="dot">.</span>
            <el-input 
            v-model.number="ip2"
            maxlength='3' ref='ip2'
            class="ipInput"
            @paste.native="handlePaste(2,$event)"
            @keyup.native="keyupEvent(2,$event)"
            @blur="submitIp"
            @input="(val) => handleInpIp(val,'ip2')"></el-input>
            <span class="dot">.</span>
            <el-input 
            v-model.number="ip3"
            maxlength='3' ref='ip3'
            class="ipInput"
            @paste.native="handlePaste(3,$event)"
            @keyup.native="keyupEvent(3,$event)"
            @blur="submitIp"
            @input="(val) => handleInpIp(val,'ip3')"></el-input>
            <span class="dot">.</span>
            <el-input 
            v-model.number="ip4"
            maxlength='3' ref='ip4'
            class="ipInput"
            @paste.native="handlePaste(4,$event)"
            @keyup.native="keyupEvent(4,$event)"
            @blur="submitIp"
            @input="(val) => handleInpIp(val,'ip4')"></el-input>

            <i v-if="isShowDeleteBtn" class="closeBtn el-icon-circle-close m-r5" @click="clearValue"></i>
        </div>
    </div>
</template>
<script>
export default {
    name: "IpModel",
    model:{
        prop:"value",
        event:"change",
    },
    props:{
        value:String
    },
    data() {
        return {
            ip1: null,
            ip2: null,
            ip3: null,
            ip4: null,
            isShowDeleteBtn:false
        };
    },
    methods: {
        //利用复制粘贴的方式输入ip地址
        handlePaste(index, event) {
            const e = event || window.event
            let ipValue = e.clipboardData.getData('Text');

            if(ipValue!=null && ipValue!=undefined && ipValue!==""){
                let reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
                //IP地址格式不正确
                if(!reg.test(ipValue)){
                    this.$message.error("请输入正确的IP地址dsfdsf!");
                    setTimeout(() => {
                        this.ip1 = null;
                        this.ip2 = null;
                        this.ip3 = null;
                        this.ip4 = null;
                    }, 600)
                    if (index == 1) {
                        setTimeout(() => {
                            this.$refs.ip1.focus();
                        }, 100)
                    }
                    if (index == 2) {
                        setTimeout(() => {
                            this.$refs.ip2.focus();
                        }, 100)
                    }
                    if (index == 3) {
                        setTimeout(() => {
                            this.$refs.ip3.focus();
                        }, 100)
                    }
                    if (index == 4) {
                        setTimeout(() => {
                            this.$refs.ip4.focus();
                        }, 100)
                    }
                }
                else{
                    let ipList = ipValue.split('.');
                     setTimeout(() => {
                        this.ip1 = ipList[0];
                        this.ip2 = ipList[1];
                        this.ip3 = ipList[2];
                        this.ip4 = ipList[3];
                        this.$refs.ip4.focus();
                        this.isShowDeleteBtn = true;
                    }, 5)
                }
            }
        },

        //监听键盘(按下.键跳到下一个输入框,同理可做出其他按键的跳转输入框)
        keyupEvent (index,e) {
            //不同键盘键位对应 . 的值 87键->190  104键->110 
            if (e.keyCode === 110 || e.keyCode === 190) {
                if (index == 1) {
                    this.$nextTick(() => {
                        this.$refs.ip2.focus();
                    });
                } 
                else if (index == 2) {
                    this.$nextTick(() => {
                        this.$refs.ip3.focus();
                    });
                } 
                else {
                    this.$nextTick(() => {
                        this.$refs.ip4.focus();
                    });
                }
                this["ip"+index] = "";
            }
            //按下backspace删除键
            if (e.keyCode == 8) {
                let ipVal = this["ip"+index];
                if(ipVal==="" || ipVal==null && index!==1){
                    let indexValue = index-1;
                    this.$refs['ip'+indexValue].focus();
                }
            }
        },

        //输入框输入时
        handleInpIp(val, key) {
            //是否隐藏清除按钮
            if((this.ip1 !== null&&this.ip1 !== "") || (this.ip2 !== null&&this.ip2 !== "") || (this.ip3 !== null&&this.ip3!=="") || (this.ip4 != null&&this.ip4!=="")){
                this.isShowDeleteBtn = true;
            }
            else{
                this.isShowDeleteBtn = false;
            }

            //判断输入的ip值,如果输入值超过255,则显示为255,并且跳到下一个输入框
            if(parseInt(val) > 255) {
                switch(key) {
                    case "ip1":
                        this.ip1 = 255;
                        this.$refs.ip2.focus();
                        break;
                    case "ip2":
                        this.ip2 = 255;
                        this.$refs.ip3.focus();
                        break;
                    case "ip3":
                        this.ip3 = 255;
                        this.$refs.ip4.focus();
                        break;
                    case "ip4":
                        this.ip4 = 255;
                        break;
                    default:
                        break;
                }
            }
            //如果输入的是三位数,且范围在100到255之间,则自动跳到下一个输入值
            else if(parseInt(val) <= 255 && parseInt(val) >= 100){
                switch(key) {
                    case "ip1":
                        this.$refs.ip2.focus();
                        break;
                    case "ip2":
                        this.$refs.ip3.focus();
                        break;
                    case "ip3":
                        this.$refs.ip4.focus();
                        break;
                    default:
                        break;
                }
            }
        },

        //输入框失去焦点时
        submitIp() {
            if((this.ip1==null || this.ip1==="") && (this.ip2==null || this.ip2==="") && (this.ip3==null || this.ip3==="") && (this.ip4==null || this.ip4==="")){
                let ipVal = "";
                this.$emit('change', ipVal);
            }
            else{
                let reg = /[^\d]/g; 
                let ipVal = "";
                let regIp1 = false;
                let regIp2 = false;
                let regIp3 = false;
                let regIp4 = false;
                
                if(this.ip1 !=null && this.ip1 !==""){
                    regIp1 = reg.test(this.ip1);
                }
                if(this.ip2 !=null && this.ip2 !==""){
                    regIp2 = reg.test(this.ip2);
                }
                if(this.ip3 !=null && this.ip3 !==""){
                    regIp3 = reg.test(this.ip3);
                }
                if(this.ip4 !=null && this.ip4 !==""){
                    regIp4 = reg.test(this.ip4);
                }
                //验证ip1、ip2、ip3、ip4的输入格式,只要有一个输入不正确,就提示报错信息
                if(regIp1 || regIp2 || regIp3 || regIp4){
                    this.$message.error("请输入正确的IP地址uuu!");
                    this.ip1 = null;
                    this.ip2 = null;
                    this.ip3 = null;
                    this.ip4 = null;
                    this.isShowDeleteBtn = false; //隐藏清除按钮
                    ipVal = "";
                }
                else{
                    let ip1 = this.ip1==null?"":this.ip1;
                    let ip2 = this.ip2==null?"":this.ip2;
                    let ip3 = this.ip3==null?"":this.ip3;
                    let ip4 = this.ip4==null?"":this.ip4;
                    ipVal = ip1 + '.' + ip2 + '.' + ip3 + '.' + ip4;
                }
                this.$emit('change', ipVal);
            }
        },

        //清除ip
        clearValue () {
            //重置ip输入框
            this.ip1 = null;
            this.ip2 = null;
            this.ip3 = null;
            this.ip4 = null;
            this.isShowDeleteBtn = false; //隐藏清除按钮
            let ipVal = "";
            this.$emit('change', ipVal);
        },
    },
    watch:{
        value(val) {
            let ipVal = "";
            if(val !== null && val !== undefined && val !==""){
                let ipList = val.split('.');
                this.ip1 = ipList[0];
                this.ip2 = ipList[1];
                this.ip3 = ipList[2];
                this.ip4 = ipList[3];
                ipVal =  this.ip1+'.'+this.ip2+'.'+this.ip3+'.'+this.ip4
            }
            else{
                ipVal =="";
            }
            //this.$emit("change",ipVal)
        },
    }
}
</script>
<style scoped lang='less'>
.dot {
    width: 4px;
}
.ipBox{
    width: 291px;
    border: 1px solid #ccc;
    border-radius: 5px;
}
.ipInput{
    width: 65px;
    /deep/ .el-input__inner {
        border: 0;
        text-align: center;
    }
    font-size: 14px;
}
.closeBtn{
    color: #C0C4CC;
    font-size: 14px;
    transition: transform .3s;
    transform: rotateZ(180deg);
    cursor: pointer;
}
</style>

如有漏洞,欢迎互动指教!!!!!!!!!!!!!

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值