el-select multiple状态下,修改特定值el-tag的样式

在工作中遇到一个需求,将选中的tag中status值为0的tag设置为不同的样式,类似这样。

本来以为可以在el-select中利用类似插槽的写法来定制el-tag,在网上找了很久,发现貌似没有这种写法。这里的el-tag貌似是element-ui根据数值自动生成的。

于是用原始js,通过document.getElementsByClassName来修改样式和添加结构。

这里大概可以实现效果,但是会有样式覆盖延时的问题,有朋友知道如何优雅解决这个问题的话,可以滴滴我。

HTML代码:

<template>
  <div id="root">
    <!-- 在el-select聚焦和失焦时,el-select的样式又会重新覆盖,
         所以需要再次调用覆盖框架的样式,
        但是失焦时需要更大的时间间隔,感觉效果不是很好,有更好解决方案可以滴滴我 
    -->
    <el-select
      v-model="value1"
      multiple
      placeholder="请选择"
      @focus="changeTag(1)"
      @blur="changeTag(600)"
    >
      <el-option
        v-for="item in options"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      >
      </el-option>
    </el-select>
  </div>
</template>

 Js代码:

export default {
  name: "App",

  data() {
    return {
      options: [
        {
          value: "选项1",
          label: "黄金糕",
        },
        {
          value: "选项2",
          label: "双皮奶",
        },
        {
          value: "选项3",
          label: "蚵仔煎",
        },
        {
          value: "选项4",
          label: "龙须面",
        },
        {
          value: "选项5",
          label: "北京烤鸭",
        },
      ],
      value1: ["选项1"],
    };
  },
  methods: {
    changeTag(timeout = 500) {
      // 本来尝试用$nextTick,但是不起效果,遂用setTimeout,记得清除
      setTimeout(() => {
        let iconNum = 0;
        for (let i = 0; i < this.value1.length; i++) {
          // 这里写需要改变样式的tag的判断逻辑
          if (
            this.value1[i] === "选项1" ||
            this.value1[i] === "选项2" ||
            this.value1[i] === "选项4"
          ) {
            // 获取各个需要改变样式的element
            let tagInfo = document.getElementsByClassName("el-tag");
            let tagText = document.getElementsByClassName(
              "el-select__tags-text"
            );
            tagInfo[i].style.backgroundColor = "black";
            tagText[i].style.color = "red";

            // icon的原生html结构
            let edit = `
              <i class="el-icon-warning-outline my-warn">
              </i>  
            `;
            iconNum++;
            let myWarn = document.getElementsByClassName("my-warn");
            // 防止重复调用方法导致添加多个icon
            if (myWarn.length == iconNum - 1) {
              tagText[i].insertAdjacentHTML("afterend", edit);
            }
          }
        }
      }, timeout);
    },
  },
  watch: {
    // 在选项改变时,el-select的样式又会重新覆盖,所以需要再次调用覆盖框架的样式
    value1() {
      this.changeTag(1);
    },
  },
  mounted() {
    this.changeTag();
  },
};
</script>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
el-select多选时,可以设置最大可选数量和已选数量,但是没有直接设置tag的选项。可以通过设置自定义模板来实现类似tag的效果。具体实现方法如下: 1. 在el-select中设置multiple属性,开启多选模式。 2. 在el-select中设置max-tag-count属性,限制显示tag的最大数量。 3. 在el-select中设置placeholder属性,用于显示已选数量。 4. 在el-select中设置filterable属性,开启搜索功能。 5. 在el-select中设置clearable属性,允许清空已选项。 6. 在el-select中设置v-model属性,绑定已选项列表。 7. 在el-select中设置自定义模板,将已选项列表渲染成tag样式。 以下是一个示例代码: ``` <el-select v-model="selectedItems" multiple filterable clearable max-tag-count="3" placeholder="已选 {{ selectedItems.length }} 项" > <template #tags> <el-tag v-for="(item, index) in selectedItems" :key="index" closable @close="removeSelected(index)" > {{ item }} </el-tag> </template> <el-option v-for="(item, index) in options" :key="index" :label="item.label" :value="item.value" /> </el-select> ``` 在上面的代码中,selectedItems是一个数组,用于存储已选项列表。removeSelected方法用于删除已选项。options是可选项列表,根据实际情况进行设置即可。通过自定义模板中的el-tag标签,将已选项渲染成tag样式,达到类似tag的效果。max-tag-count属性限制了最多显示3个tag,placeholder属性显示已选项数量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值