解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题


Posted in Javascript onAugust 14, 2020

这是一个项目中常见的需求,el-select 为下拉多选,默认值不可删除,或者指定值不可删除。

实现效果:

解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题

el-select 如下源码中 tag closable 属性为 el-select 的 disabled 属性,所有明显不支持。

解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题

解决思路(从el-select 的角度来考虑,其他组件组合的情况暂不考虑)

想要实现某些选项是不删除,1、需要tag 不可删除,2、options 不可选择

options 不可选择很好实现,只需要给一个disabled属性。tag 不可删除才是关键。下面是我几种解决思路。

1、 watch 进行监听,当操作不可删除的选项时,el-select 绑定的值中 将之前删除的选项重新添加到原来的位置。达到不可删除的效果。(这种方法虽然可以实现,但是tag上还是会有 “x” 会给用户一种误导)

2、使用样式,定位到 tag中,将icon “x” 设置 display:none; 将关闭 按钮隐藏,达到不可删除的效果。

3、复制一份 element-ui 中 el-select 源码 进行少量的修改,给 tag 添加一个 closagle 的属性。达到可控的效果。(这种方式增加了开发维护成本,当项目中 element-ui 升级版本的时候,需要重新对源码赋值一份进行修改)

4、使用 derictive 给 element-ui 中 tag 添加样式,实际上是对思路二的一种实现。

思路是这么一个思路,也对思路1和4进行了实现。但是综合考虑下,还是针对思路4做下记录,感觉有一点点复用意义。其它的参考价值不大。代码如下定义了一个全局的指令,也可以定义在组件里面。

// index.vue
 
 <el-select v-model="ruleForm.ability" multiple placeholder="请选择">
	<el-option
	 v-for="(item, index) in abilityOptions"
	 :key="index"
	 :label="`${item.abilityNameZh}(${item.abilityId})`"
	 :disabled="item.required === 1"
	 :value="item.abilityId">
	</el-option>
 </el-select>
// main.js
 
Vue.directive('defaultSelect', {
 componentUpdated (el, bindings, vnode) {
  // values v-model 绑定值
  // options 下拉选项
  // prop 对应 options 中 的 value 属性
  // defaultProp 默认值判断属性 
  // defaultValue 默认值判断值
  const [values, options, prop, defaultProp, defaultValue] = bindings.value
  // 需要隐藏的标签索引
  const indexs = []
  const tempData = values.map(a => options.find(op => op[prop] === a))
  tempData.forEach((a, index) => {
   if (a[defaultProp] === defaultValue) indexs.push(index)
  })
  const dealStyle = function (tags) {
   tags.forEach((el, index) => {
    if (indexs.includes(index) && ![...el.classList].includes('select-tag-close-none')) {
     el.classList.add('none')
    }
   })
  }
  // 设置样式 隐藏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)
  }
 }
})
// style.css 
.none { display: none; }

补充知识:vue+elementUI+select 选中多个值,我要删除其中的一两个 方法如下

我就废话不多说了,大家还是直接看代码吧~

<el-select value-key="moduleCode"
      multiple filterable
      allow-create default-first-option
      @remove-tag='removeTag'
      v-model="ruleForm.module3" placeholder="请选择权限分类" style="width: 240px">
 <el-option v-for="item in level3" :value="item" :label="item.moduleName" :key="item.moduleCode"></el-option>
</el-select>
methods:{

removeTag(key){
 console.log(key);//获取option中item
}
}

以上这篇解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery autocomplete自动完成插件的的使用方法
Aug 07 Javascript
百度地图api应用标注地理位置信息(js版)
Feb 01 Javascript
jQuery表单域属性过滤器用法分析
Feb 10 Javascript
js基于cookie记录来宾姓名的方法
Jul 19 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 Javascript
JavaScript奇技淫巧44招【实用】
Dec 11 Javascript
angular过滤器实现排序功能
Jun 27 Javascript
使用Node.js搭建静态资源服务详细教程
Aug 02 Javascript
实时监控input框,实现输入框与下拉框联动的实例
Jan 23 Javascript
浅谈vuejs实现数据驱动视图原理
Feb 23 Javascript
element-ui上传一张图片后隐藏上传按钮功能
May 22 Javascript
Json实现传值到后台代码实例
Jun 30 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
Aug 14 #Javascript
vue在App.vue文件中监听路由变化刷新页面操作
Aug 14 #Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
Aug 14 #Javascript
在vue中封装方法以及多处引用该方法详解
Aug 14 #Javascript
JS+css3实现幻灯片轮播图
Aug 14 #Javascript
浅谈vue获得后台数据无法显示到table上面的坑
Aug 13 #Javascript
vue 解决data中定义图片相对路径页面不显示的问题
Aug 13 #Javascript
You might like
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
php的4种常见运行方式
2015/03/20 PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
2015/10/10 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
extjs两个tbar问题探讨
2013/08/08 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
2018/11/16 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
python绘制双柱形图代码实例
2017/12/14 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
解决Django no such table: django_session的问题
2020/04/07 Python
Viking比利时:购买办公用品
2019/10/30 全球购物
物业管理求职自荐信
2013/09/25 职场文书
学生实习自我鉴定
2013/10/11 职场文书
书香家庭事迹材料
2014/05/09 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书
oracle覆盖导入dmp文件的2种方法
2021/05/21 Oracle