解决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 相关文章推荐
YUI Compressor压缩JavaScript原理及微优化
Jan 07 Javascript
基于jquery的手风琴图片展示效果实现方法
Dec 16 Javascript
js实现的早期滑动门菜单效果代码
Aug 27 Javascript
微信公众号支付H5调用支付解析
Nov 04 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
Jan 13 Javascript
React学习之事件绑定的几种方法对比
Sep 24 Javascript
分享vue.js devtools遇到一系列问题
Oct 24 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
Apr 05 Javascript
微信小程序实现手指触摸画板
Jul 09 Javascript
JavaScript 事件代理需要注意的地方
Sep 08 Javascript
vue中使用echarts的示例
Jan 03 Vue.js
JavaScript数组reduce()方法的语法与实例解析
Jul 07 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
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php 小乘法表实现代码
2009/07/16 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
javascript 表单的友好用户体现
2009/01/07 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
Bootstrap每天必学之导航组件
2016/04/25 Javascript
需要牢记的JavaScript基础知识
2016/09/25 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
vue实现图片上传预览功能
2019/12/23 Javascript
js实现3D旋转效果
2020/08/18 Javascript
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
Web服务器框架 Tornado简介
2014/07/16 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
python实现银行实战系统
2020/02/26 Python
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
停水通知
2015/04/16 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书