背景:最近遇到⼀个需求,页⾯有新增和编辑两个功能,但是编辑的时候只能添加新的选项,不可删除已有的选项。
效果图如下:

beeb38606cc0414f81a0c9fd2b096177.png

分析:
禁止删除无非就是要做到两个点:

el-tag 已选择的不可删除
el-option 已选择的不可操作
解决:
第一步:全局自定义一个指令

// directive.js (和main.js同级)
import Vue from 'vue';

Vue.directive('defaultSelect', {
  componentUpdated(el, bindings) {
    const [defaultValues] = bindings.value;
    const dealStyle = function(tags) {
      // 因为不可删除原有值,所以原有值的index是不会变的,也就是将前n个tag的close隐藏掉即可。n即已有值的长度defaultValues.length
      tags.forEach((el, index) => {
        if (
          index <= defaultValues.length - 1 &&
          ![...el.classList].includes('select-tag-close-none')
        ) {
          el.style.display = 'none'; // close 图标隐藏掉
        }
      });
    };
    // 设置样式隐藏close icon
    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);
    }
  }
});
//v-default-select="[enterpriseIds]" :disabled="enterpriseIds.includes(item.id)"

第二步:在main.js导入

import './directive/defaultSelect';

第三步:使用

v-default-select="[enterpriseIds]" :disabled="enterpriseIds.includes(item.id)"
<el-select
 style="width: 100%"
  multiple
  :disabled="$route.query.enterpriseId"
  v-model='form.enterpriseIds'
  placeholder='请选择'
  v-default-select="[enterpriseIds]"
>
  <el-option
    v-for='item in enterpriseList'
    :disabled="enterpriseIds.includes(item.id)"
    :label='item.name'
    :value='item.id'
    :key='item.id'
  />
</el-select>

data(){
    return {
        form:{},
        enterpriseList:[],
        enterpriseIds:[] // 已选择的值,打开进入编辑页面时赋值即可
    }
}

标签: none

添加新评论