vue+element封装一个填写和校验ip地址的组件

输入ip地址,输完自己切换到一下输入框,校验IP的准确性。
组件样式如下图
在这里插入图片描述

使用方法

<template>
  <IpAddress v-model="deviceIPAddress" />
  </template>
<script>

export default {
data () {
    return {
      deviceIPAddress:''  //输出格式是字符串 192.166.111.10
    }
}

</script>

IpAddress组件代码

<template>
  <div class="IpBox">
    <div class="IpItem" v-for="(item, index) in ipAddress" :key="index">
      <input type="text" v-model="item.value" @input="checkIpVal(item)" @keyup="turnIpPosition(item, index, $event)" class="inputBox" ref="ipInput" />
      <span v-show="index<3">.</span>
    </div>
  </div>
</template>

<script>
export default {
  model: {
    prop: "value",
    event: "change",
  },
  props: {
    value: {
      type: String,
      default: "",
    },
  },
  data () {
    return {
      ipAddress: [
        {
          value: "",
        },
        {
          value: "",
        },
        {
          value: "",
        },
        {
          value: "",
        },
      ],
    };
  },
  mounted () {
    if (this.value === "") {
      this.ipAddress[0].value = "";
      this.ipAddress[1].value = "";
      this.ipAddress[2].value = "";
      this.ipAddress[3].value = "";
    } else {
      let ipList = this.value.split(".");
      this.ipAddress[0].value = ipList[0] || "";
      this.ipAddress[1].value = ipList[1] || "";
      this.ipAddress[2].value = ipList[2] || "";
      this.ipAddress[3].value = ipList[3] || "";
    }
  },
  watch: {
    ipAddress: {
      // 双向数据绑定的value
      handler: function (newVal, oldVal) {
        let str = "";
        for (const i in this.ipAddress) {
          str += this.formatter(this.ipAddress[i].value);
        }
        if (str === "000000000000") {
          str = "";
        }
        this.$emit(
          "change",
          this.ipAddress.map((item) => item.value + "").join(".")
        );
      },
      deep: true,
    },
  },
  methods: {
    // 格式化补零方法
    formatter (val) {
      let value = val.toString();
      if (value.length === 2) {
        value = "0" + value;
      } else if (value.length === 1) {
        value = "00" + value;
      } else if (value.length === 0) {
        value = "000";
      }
      return value;
    },
    // 检查ip输入为0-255
    checkIpVal (item) {
      //确保每个值都处于0-255
      let val = item.value;
      // 处理非数字
      val = val.toString().replace(/[^0-9]/g, "");
      val = parseInt(val, 10);
      if (isNaN(val)) {
        val = "";
      } else {
        val = val < 0 ? 0 : val;
        val = val > 255 ? 255 : val;
      }
      item.value = val;
    },
    // 光标位置判断
    turnIpPosition (item, index, event) {
      let self = this;
      let e = event || window.event;
      if (e.keyCode === 37) {
        // 左箭头向左跳转,左一不做任何措施
        if (index !== 0 && e.currentTarget.selectionStart === 0) {
          self.$refs.ipInput[index - 1].focus();
        }
      } else if (e.keyCode == 39) {
        // 右箭头向右跳转,右一不做任何措施
        if (
          index !== 3 &&
          e.currentTarget.selectionStart === item.value.toString().length
        ) {
          self.$refs.ipInput[index + 1].focus();
        }
      } else if (e.keyCode === 8) {
        // 删除键把当前数据删除完毕后会跳转到前一个input,左一不做任何处理
        if (index !== 0 && item.value === "") {
          self.$refs.ipInput[index - 1].focus();
        }
      } else if (e.keyCode === 13 || e.keyCode === 32 || e.keyCode === 190) {
        // 回车键、空格键、冒号均向右跳转,右一不做任何措施
        if (index !== 3) {
          self.$refs.ipInput[index + 1].focus();
        }
      } else if (item.value.toString().length === 3) {
        // 满3位,光标自动向下一个文本框
        if (index !== 3) {
          self.$refs.ipInput[index + 1].focus();
        }
      }
    },
  },
};
</script>


 <style lang="scss" scoped>
.IpBox {
  display: flex;
  margin-top: 10px;
  .IpItem {
    .inputBox {
      width: 61px;
      height: 35px;
      text-align: center;
      display: inline-block;
      vertical-align: text-bottom;
      line-height: 35px;
      background: #f2f2f2;
      border: 1px solid #c3c3c3;
      border-radius: 3px;
      margin-left: 2px;
      color: #888;
      box-sizing: border-box;
    }
    span {
      display: inline-block;
      vertical-align: baseline;
      width: 5px;
      text-align: center;
      font-size: 28px;
      margin-right: 2px;
    }
  }
}
/*取消掉默认的input focus状态*/
.IpItem input:focus {
  outline: none;
}
</style>


VueElement可以一起使用来封装一个选人弹窗。首先,我们需要使用Vue框架来构建弹窗组件,然后使用Element UI库来实现弹窗的样式和组件。 在Vue中,我们可以使用组件的方式来封装选人弹窗。首先,我们需要创建一个组件文件,命名为"selectUserModal.vue"。然后,在该组件中,我们可以使用Element UI的Modal组件作为弹窗容器,使用Form组件和Table组件等来展示选择人员的界面。 在"selectUserModal.vue"中,我们可以定义一个data属性来存储选择的人员信息,以及一个visible属性来控制弹窗的显示和隐藏。我们还可以定义一些方法来处理用户的选择操作,如确定选择和取消选择等。 在弹窗的界面中,我们可以使用Form组件来展示与人员选择相关的输入框,如搜索框和筛选条件等。然后,在表格中展示人员列表,可以使用Table组件,并绑定数据源和列定义。 为了实现人员选择操作,我们可以提供一个确认按钮,当用户点击确认按钮时,我们可以触发一个自定义事件,并将选择的人员信息作为参数进行传递。其他的操作,如点击表格行即选中人员,我们也可以在相应的方法中进行处理。 当组件完成后,我们可以在其他Vue页面中引用该组件,并传递参数来控制弹窗的显示。通过监听自定义事件,我们可以在父组件中获取到选择的人员信息,并进行相应的操作。 总结起来,通过VueElement的配合,我们可以封装一个选人弹窗组件,使其能在Vue项目中方便地使用,并具有良好的交互和样式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值