解决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 相关文章推荐
div模拟滚动条效果示例代码
Oct 16 Javascript
javascript中的事件代理初探
Mar 08 Javascript
jquery实现图片上传前本地预览功能
May 10 Javascript
AngularJS  自定义指令详解及实例代码
Sep 14 Javascript
详解jQuery中的事件
Dec 14 Javascript
微信小程序 弹幕功能简单实例
Feb 14 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
Jun 03 Javascript
vue router自动判断左右翻页转场动画效果
Oct 10 Javascript
基于jquery的on和click的区别详解
Jan 15 jQuery
JavaScript中关于base64的一些事
May 06 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
Sep 05 Javascript
JavaScript实现放大镜效果代码示例
Apr 29 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
PHP Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
浅谈thinkphp的实例化模型
2015/01/04 PHP
你应该知道PHP浮点数知识
2015/05/13 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
用nodejs搭建websocket服务器
2017/01/23 NodeJs
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
2018/07/23 Javascript
150行代码带你实现微信小程序中的数据侦听
2019/05/17 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
python装饰器实例大详解
2017/10/25 Python
python 随机森林算法及其优化详解
2019/07/11 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
html5组织文档结构_动力节点Java学院整理
2017/07/11 HTML / CSS
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
室内设计专业学生的自我评价分享
2013/11/27 职场文书
京剧自荐信
2014/01/26 职场文书
广告设计应届生求职信
2014/03/01 职场文书
邻里守望志愿服务活动方案
2014/08/15 职场文书
民事调解书范文
2015/05/20 职场文书
儿子满月酒致辞
2015/07/29 职场文书
采购部年度工作总结
2015/08/13 职场文书
靠谱准确的求职信
2019/04/02 职场文书
Python代码风格与编程习惯重要吗?
2021/06/03 Python