基于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之AJAX框架使用说明
Apr 24 Javascript
鼠标右击事件代码(asp.net后台)
Jan 27 Javascript
JS函数重载的解决方案
May 13 Javascript
node.js正则表达式获取网页中所有链接的代码实例
Jun 03 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
Aug 07 Javascript
Bootstrap每天必学之js插件
Nov 30 Javascript
Javascript数组循环遍历之forEach详解
Nov 07 Javascript
Angular多选、全选、批量选择操作实例代码
Mar 10 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
Oct 31 Javascript
JS执行控制之节流模式实例分析
Dec 21 Javascript
JS中注入eval, Function等系统函数截获动态代码
Apr 03 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
Nov 10 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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
js下写一个事件队列操作函数
2010/07/19 Javascript
关于javascript function对象那些迷惑分析
2011/10/24 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
python 队列详解及实例代码
2016/10/18 Python
python实现学生信息管理系统
2020/04/05 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
家长给孩子的评语
2014/01/30 职场文书
投资协议书范本
2014/04/21 职场文书
房产公证书
2015/01/23 职场文书
2015年度党员个人总结
2015/02/14 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技
Java使用HttpClient实现文件下载
2022/08/14 Java/Android