input 包含多个tag 点击可继续添加

需求

需要一个iput框输入,离焦或回车后生成一个标签,提交时判断符不符合规则

思路

input框的值不能为数组,所以用一个div设置样式模拟输入框,隐藏输入框的样式;前半段循环显示tag, 利用@keyup.enter="addTags" (回车)和@blur="addTags"(离焦)添加tag, 规则判断需要用到循环;

缺点

在输入值时未验证,需改进

代码

<template>
    <div style="width:800px">
      <el-form ref="form" :model="form" label-width="120px"  :rules="rule">
        <el-form-item label="白名单"  prop="allowedHosts">
          <div class="contaion" @click="onclick">
    <!-- 生成的标签 -->
    <div v-for="(item, index) in form.allowedHosts" :key="index" class="spanbox">
      <span class="tagspan">{{ item }}</span>
      <i class="iClose" @click="removeTag(item,index)"></i>
    </div>
    <!-- 输入框 -->
    <input
       v-model="form.inputValue"
      @keyup.enter="addTags"
      @blur="addTags"
      :style="inputStyle"
      class="inputTag"
      ref="inputTag"
      type="text"
    />
  </div>
  
        </el-form-item>
        <el-form-item>
            
            </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="onSubmit">保存</el-button>
          <el-button>取消</el-button>
        </el-form-item>
      </el-form>
     
 
      </div>
  </template>
  
  <script>
  export default {
    props:{
        allowedHosts:{
         type:Object,
      }
    },
    
    data(){
        var validIp = (rule, value, callback) => {
            var ipreg = /((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}/;
            if (value.length > 0) {
                let flag = true;
                value.forEach(item => {
                     if (item != "*" && !ipreg.test(item) ) {
                        flag = false;
                    }
                })
                if (!flag) {
                    callback(new Error("白名单中含有错误的IP地址,请重新输入"));
                } else {
                    callback();
                }
            }else{
                callback(new Error("请输入白名单"));
            }
            
    };
      return{
        form:{
            allowedHosts:[],  //tag
            inputValue: "",        //输入框
        },
      //输入框宽度
      inputLength: "",
      //计算删除位置
      n: 0,
        rule:{
            allowedHosts:[{required:true,message:'请输入需要加入白名单的主机',trigger:'change'},
           { required: true, validator: validIp, trigger: "change" }],
        }
      }
    },
    watch: {
    //监听输入的值越多,输入框越长
    "form.inputValue"(val) {
      // 实时改变input输入框宽度,防止输入内容超出input默认宽度显示不全
      this.inputLength = this.$refs.inputTag.value.length * 12 + 50;
    },
  },
  computed: {
    //计算属性:计算出动态输入框宽度
    inputStyle() {
      let style = {};
      style.width = `${this.inputLength}px`;
      return style;
    }
  },
    methods:{
      
      //点击叉叉删除tag
    removeTag(item,index) {
      this.form.allowedHosts.splice(index, 1);
     },
 
    //回车增加tag
    addTags() {
      //新增函数中可以加一些你所需要的校验规则。比如只能是数子,或者不能输入‘,’等
      if (this.form.inputValue) {
         //添加tag
          this.form.allowedHosts.push(this.form.inputValue);
          //清空输入框
          this.form.inputValue = "";
      }
    },
    //点击父盒子输入框获取焦点
    onclick() {
      this.$nextTick(() => {
        this.$refs.inputTag.focus();
      })
    }
 
    }
  }
  </script>
  
  <style  scoped>
  .contaion {
  width: 600px;
  box-sizing: border-box;
  background-color: white;
  border: 1px solid #409EFF;
  border-radius: 4px;
  font-size: 12px;
  text-align: left;
  padding-left: 5px;
  word-wrap: break-word;
  overflow: hidden;
}
/* 标签 */
.spanbox {
  display: inline-block;
  font-size: 14px;
  margin: 3px 4px 3px 0;
  background-color: #ecf5ff;
  border: 1px solid #e8eaec;
  border-radius: 3px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04)
}
/* 标签文字 */
.tagspan {
  height: 24px;
  line-height: 22px;
  max-width: 99%;
  position: relative;
  display: inline-block;
  padding-left: 8px;
  color: #409EFF;
  font-size: 14px;
  opacity: 1;
  vertical-align: middle;
  overflow: hidden;
  transition: 0.25s linear;
}
/* tag的叉叉 */
.iClose {
  padding: 0 6px 0 4px;
  opacity: 1;
  -webkit-filter: none;
  filter: none;
  color: #409EFF;
  /* font-weight: 600; */
  cursor:pointer;
}
/* 鼠标经过叉叉 */
.iClose:hover{
  background-color: #409EFF;
  border-radius: 50%;
  color: #fff;
}
.iClose:after {
  content: "\00D7";
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* line-height: 27px; */
  transition: 0.3s, color 0s;
}
/* input */
.inputTag {
  font-size: 16px;
  border: none;
  box-shadow: none;
  outline: none;
  background-color: transparent;
  padding: 0;
  width: auto;
  min-width: 150px;
  vertical-align: top;
  height: 32px;
  color: #495060;
  line-height: 32px;
}
/* 输入框提示文字大小 */
input:placeholder-shown {
font-size: 10px;
}
 
  </style>

结果

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容