基于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 相关文章推荐
JS实现可改变列宽的table实例
Jul 02 Javascript
jQuery Mobile 导航栏代码
Nov 01 Javascript
Javascript中的异步编程规范Promises/A详细介绍
Jun 06 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
Aug 15 Javascript
实例讲解jquery中mouseleave和mouseout的区别
Feb 17 Javascript
javascript实现的猜数小游戏完整实例代码
May 10 Javascript
jQuery soColorPacker 网页拾色器
Jun 22 Javascript
JS正则表达式判断有效数实例代码
Mar 13 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
May 04 jQuery
vue之数据交互实例代码
Jun 16 Javascript
使用Angular CLI生成路由的方法
Mar 24 Javascript
vue实现计步器功能
Nov 01 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
smarty section简介与用法分析
2008/10/03 PHP
php 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
php构造函数的继承方法
2015/02/09 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
如何在指定的地方插入html内容和文本内容
2013/12/23 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
JavaScript中的几种继承方法示例
2020/12/06 Javascript
python 实现自动远程登陆scp文件实例代码
2017/03/13 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
Linux下python3.7.0安装教程
2018/07/30 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
计算机专业职业规划
2014/02/28 职场文书
企业党建工作总结2015
2015/05/26 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS