基于Element的组件改造的树形选择器(树形下拉框)


Posted in Javascript onFebruary 27, 2020

前言:由于做项目需要一个树形选择器,项目用的也是element-ui框架,然而它自带的选择器组件没有树形选项,又不想引入其他的框架组件,于是自己利用el-select和el-tree改造了一个,感觉还挺好用的,就封装成了一个组件,如下图:

element-ui的el-select组件的选项只能是列表形式:

基于Element的组件改造的树形选择器(树形下拉框)

 改造后的树形选择器:

基于Element的组件改造的树形选择器(树形下拉框)

简介:此树形选择器组件是基于elment-ui框架的el-select和el-tree组件的基础上改造的,其解决了原el-select组件的选项列表不能是树形的问题,集合了前两个组件的属性和方法封装成了一个组件,引入即可使用。其实现了树形列表、默认展开、默认选中、清空选值等功能,基本上可以满足大部分选择器的使用需求。

主要代码

组合el-select和el-tree组件:

<template>
 <el-select :value="valueTitle" :clearable="clearable" @clear="clearHandle">
  <el-option :value="valueTitle" :label="valueTitle">
   <el-tree id="tree-option"
    ref="selectTree"
    :accordion="accordion"
    :data="options"
    :props="props"
    :node-key="props.value"  
    :default-expanded-keys="defaultExpandedKey"
    @node-click="handleNodeClick">
   </el-tree>
  </el-option>
 </el-select>
</template>

封装组件:

<script>
export default {
 name: "el-tree-select",
 props:{
  /* 配置项 */
  props:{
   type: Object,
   default:()=>{
    return {
     value:'id',       // ID字段名
     label: 'title',     // 显示名称
     children: 'children'  // 子级字段名
    }
   }
  },
  /* 选项列表数据(树形结构的对象数组) */
  options:{
   type: Array,    
   default: ()=>{ return [] }
  },
  /* 初始值 */
  value:{
   type: Number,
   default: ()=>{ return null }
  },
  /* 可清空选项 */
  clearable:{
   type:Boolean,
   default:()=>{ return true }
  },
  /* 自动收起 */
  accordion:{
   type:Boolean,
   default:()=>{ return false }
  },
 },
 data() {
  return {
   valueId:this.value,  // 初始值
   valueTitle:'',
   defaultExpandedKey:[]  
  }
 },
 mounted(){
  this.initHandle()
 },
 methods: {
  // 初始化值
  initHandle(){
   if(this.valueId){
    this.valueTitle = this.$refs.selectTree.getNode(this.valueId).data[this.props.label]   // 初始化显示
    this.$refs.selectTree.setCurrentKey(this.valueId)    // 设置默认选中
    this.defaultExpandedKey = [this.valueId]   // 设置默认展开
   } 
   this.$nextTick(()=>{
    let scrollWrap = document.querySelectorAll('.el-scrollbar .el-select-dropdown__wrap')[0]
    let scrollBar = document.querySelectorAll('.el-scrollbar .el-scrollbar__bar')
    scrollWrap.style.cssText = 'margin: 0px; max-height: none; overflow: hidden;'
    scrollBar.forEach(ele => ele.style.width = 0)
   })
 
  },
  // 切换选项
  handleNodeClick(node){
   this.valueTitle = node[this.props.label]
   this.valueId = node[this.props.value]
   this.$emit('getValue',this.valueId)
   this.defaultExpandedKey = []
  },
  // 清除选中
  clearHandle(){
   this.valueTitle = ''
   this.valueId = null
   this.defaultExpandedKey = []
   this.clearSelected()
   this.$emit('getValue',null)
  },
  /* 清空选中样式 */
  clearSelected(){
   let allNode = document.querySelectorAll('#tree-option .el-tree-node')
   allNode.forEach((element)=>element.classList.remove('is-current'))
  }
 },
 watch: {
  value(){
   this.valueId = this.value
   this.initHandle()
  }
 },
};
</script>

css样式:

<style scoped>
 .el-scrollbar .el-scrollbar__view .el-select-dropdown__item{
  height: auto;
  max-height: 274px;
  padding: 0;
  overflow: hidden;
  overflow-y: auto;
 }
 .el-select-dropdown__item.selected{
  font-weight: normal;
 }
 ul li >>>.el-tree .el-tree-node__content{
  height:auto;
  padding: 0 20px;
 }
 .el-tree-node__label{
  font-weight: normal;
 }
 .el-tree >>>.is-current .el-tree-node__label{
  color: #409EFF;
  font-weight: 700;
 }
 .el-tree >>>.is-current .el-tree-node__children .el-tree-node__label{
  color:#606266;
  font-weight: normal;
 }
</style>

到此这篇关于基于Element的组件改造的树形选择器(树形下拉框)的文章就介绍到这了,更多相关Element 树形选择器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
浅谈JavaScript中面向对象技术的模拟
Sep 25 Javascript
可以文本显示的公告栏的js代码
Mar 11 Javascript
javascript 写的一个简单的timer
Jul 30 Javascript
js url传值中文乱码之解决之道
Nov 20 Javascript
使用ExtJS技术实现的拖动树结点
Aug 05 Javascript
说明你的Javascript技术很烂的五个原因
Apr 26 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
Oct 24 Javascript
JavaScript实现多重继承的方法分析
Jan 09 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
Sep 20 Javascript
js根据需要计算数组中重复出现某个元素的个数
Jan 18 Javascript
wx-charts 微信小程序图表插件的具体使用
Aug 18 Javascript
夯基础之手撕javascript继承详解
Nov 09 Javascript
js与jquery获取input输入框中的值实例讲解
Feb 27 #jQuery
javascript将扁平的数据转为树形结构的高效率算法
Feb 27 #Javascript
js实现无限层级树形数据结构(创新算法)
Feb 27 #Javascript
js实现树形数据转成扁平数据的方法示例
Feb 27 #Javascript
vue学习笔记之给组件绑定原生事件操作示例
Feb 27 #Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
Feb 27 #Javascript
ElementUI中el-tree节点的操作的实现
Feb 27 #Javascript
You might like
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
PHP中的事务使用实例
2015/05/26 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
js实现最短的XML格式化工具实例
2015/03/12 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
Python类的专用方法实例分析
2015/01/09 Python
Python Django的安装配置教程图文详解
2019/07/17 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
成教自我鉴定
2013/10/27 职场文书
工商企业管理实习自我鉴定
2013/12/04 职场文书
会议主持词
2014/03/17 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
学校开除通知书
2015/04/25 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
python 三边测量定位的实现代码
2021/04/22 Python
Python中的变量与常量
2021/11/11 Python
正则表达式基础与常用验证表达式
2022/06/16 Javascript