el-select多选默认选中时添加禁止删除功能

153 阅读1分钟

前言

最近项目开发中遇到个问题,发现 el-select 多选状态给默认选项值添加 disabled 禁用后,tag 标签还能删除,这显然是不合理的。所以小小做个处理吧!

先来看看效果图吧

image.png

image.png

实现思路

先注册一个全局自定义指令 v-defaultSelect

import Vue from 'vue'

Vue.directive('defaultSelect', {
  bind(el, bindings) {
    const [defaultValues] = bindings.value // 获取不可编辑的默认值
    // 隐藏默认值的close图标
    const dealStyle = function (tags) {
      tags.forEach((el, index) => {
        if (index <= defaultValues.length - 1 && ![...el.classList].includes('select-tag-close-none')) {
          el.style.display = 'none'
        }
      })
    }

    // 设置样式隐藏
    const tags = el.querySelectorAll('.el-tag__close')
    if (tags.length === 0) {
      // 初始化tags为空的处理
      setTimeout(() => {
        const tagTemp = el.querySelectorAll('.el-tag__close')
        dealStyle(tagTemp)
      })
    } else {
      dealStyle(tags)
    }
  }
})

在main.js中的导入

import '@/directive/defaultSelect.js' // 全局指令

在vue中的应用

<template>
  <el-select v-defaultSelect="[defaultValues]" v-model="value" multiple placeholder="请选择" style="width: 30%">
    <el-option
      v-for="item in options"
      :value="item.value"
      :key="item.value"
      :label="item.label"
      :disabled="item.disabled"
    >
    </el-option>
  </el-select>
</template>

<script>
export default {
  data() {
    return {
      value: ['1', '2'],
      defaultValues: ['1', '2'],
      options: [
        {
          value: '1',
          label: '黄金糕',
          disabled: true
        },
        {
          value: '2',
          label: '双皮奶',
          disabled: true
        },
        {
          value: '3',
          label: '蚵仔煎'
        },
        {
          value: '4',
          label: '龙须面'
        },
        {
          value: '5',
          label: '北京烤鸭'
        }
      ]
    }
  }
}
</script>

<style lang="scss" scoped></style>