解决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 相关文章推荐
js控制的遮罩层实例介绍
May 29 Javascript
JS过滤url参数特殊字符的实现方法
Dec 24 Javascript
超级简单的jquery操作表格方法
Dec 15 Javascript
javascript版2048小游戏
Mar 18 Javascript
禁用backspace网页回退功能的实现代码
Nov 15 Javascript
bootstrap时间插件daterangepicker使用详解
Oct 19 Javascript
微信小程序switch组件使用详解
Jan 31 Javascript
javascript少儿编程关于返回值的函数内容
May 27 Javascript
apicloud拉起小程序并传递参数的方法示例
Nov 21 Javascript
详解vue-cli3 中跨域解决方案
Apr 10 Javascript
基于javascript的拖拽类封装详解
Apr 19 Javascript
vue使用echarts实现折线图
Mar 21 Vue.js
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
php下MYSQL limit的优化
2008/01/10 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
php中namespace use用法实例分析
2016/01/22 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
python 字符串split的用法分享
2013/03/23 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
Python抓取百度查询结果的方法
2015/07/08 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
如何验证python安装成功
2020/07/06 Python
用Python 执行cmd命令
2020/12/18 Python
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
电子商务专业应届生求职信
2014/05/28 职场文书
机关保密承诺书
2014/06/03 职场文书
幼师求职自荐信
2015/03/26 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书