下拉框_教你封装 Element Tree 树状下拉框

在日常项目开发中,树状下拉框的需求还是比较常见的,但是element并没有这种组件以供使用。在这里,小编就基于element如何封装一个树状下拉框做个详细的介绍。

通过这篇文章,你可以了解学习到一个树状下拉框组件是如何一步一步封装成功的。

话不多说,先看效果图:

00e044fdb51c54bdd9c2e5e2ecdc18cf.gif

封装组件

该组件主要基于element的select组件、tree组件及input组件进行二次封装的。

组件布局

首先我们需要基于这几个组件对我们的组件进行布局,话不多说直接上代码:

"select">"options">"tree-option"
        ref="selectTree"
      >



注:css添加scoped属性,是为了让css只在该组件生效,避免样式污染

这个时候直接使用肯定是会报错的,因为我们组件该传的参数还未传递。

组件数据完善

上面我们已经完成了布局,接下来就是为其丰富数据了,因为我们这个组件肯定是复用的,因此我们设计数据的时候,需要把常用的数据属性提取出来通过props传递接收。我提取的主要有几下几个数据:

props:{
    /* 配置项 */
    props:{
      type: Object,
      default:()=>{
        return {
          value:'id',             // ID字段名
          label: 'title',         // 显示名称
          children: 'children'    // 子级字段名
        }
      }
    },
    /* 选项列表数据(树形结构的对象数组) */
    options:{
      type: Array,       
      default: ()=>{ return [] }
    },
    /* 初始值 */
    value:{
      default: ()=>{ return null }
    },
    /* 可清空选项 */
    clearable:{
      type:Boolean,
      default:()=>{ return true }
    },
    /* 自动收起 */
    accordion:{
      type:Boolean,
      default:()=>{ return false }
    },
    placeholder:{
      type:String,
      default:()=>{return "请选择"}
    }
  },

大家可能注意到,我所有prop字段都给了type属性,唯独value没有,这是因为在实际使用中下拉框的数据value值可能是字符串(String)也可能是数字(Number),为了项目开发中控制台不报太多无意义的错,此处就没有规定其type。

接收到prop之后,我们就开始对组件进行数据的处理,直接上代码:

"placeholder" ref="select">"options">"tree-option"
        ref="selectTree"
        :accordion="accordion"
        :data="options"
        :props="props"
        :node-key="props.value"
        :default-expanded-keys="[]"
      >

当数据过多的时候,滚动条会出现两条,如下所示:

57979208e2d105faea6d03a8213d7068.png

处理方法如下:

// 初始化滚动条
initScroll(){
  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)
  })
},

mounted中调用该方法就可以了,效果如下:

954676ced1c4eb9a1e1b4343754dda5d.png

点击选中

数据也渲染显示出来了,这个时候我们需要实现点击数据选中功能。

思路很简单:

  • select组件绑定value值
  • tree组件绑定节点点击事件
  • 点击事件中获取value和label
  • 将获取的值赋给select组件以及返回给父组件

代码如下:

"valueTitle" :placeholder="placeholder" ref="select">"valueTitle" :label="valueTitle" class="options">"tree-option"
        ref="selectTree"
        :accordion="accordion"
        :data="options"
        :props="props"
        :node-key="props.value"
        :default-expanded-keys="defaultExpandedKey"
        @node-click="handleNodeClick"
        >
data() {
    return {
      valueId:this.value,// 初始值
      valueTitle:'',
      defaultExpandedKey:[]
    }
},
// 切换选项
handleNodeClick(node){
  this.valueTitle = node[this.props.label]//获取label
  this.valueId = node[this.props.value]//获取value
  this.$emit('getValue',this.valueId)//传值给父组件
},

这样点击选中功能就实现了,但是有个问题,点击之后,下拉框选项没有隐藏,我们只需要再调用一下select组件的blur方法即可实现隐藏

数据初始化

细心的小伙伴肯定已经发现了,上面有一个初始值,并且在选择器中,初始数据也是必不可少的。实现思路如下:

  • watch监听prop中value数据变化
  • 将初始值做对应赋值
  • 获取初始值对应的label并做对应赋值
  • 设置tree组件的默认选中状态
  • 设置tree组件的默认展开节点

代码如下:

watch: {
    value(){
      this.valueId = this.value
      this.initHandle()
    }
},
// 初始化值
initHandle(){
  if(this.valueId){
    // 初始化显示label
    this.valueTitle = this.$refs.selectTree.getNode(this.valueId).data[this.props.label]     
    this.$refs.selectTree.setCurrentKey(this.valueId)// 设置默认选中
    this.defaultExpandedKey = [this.valueId]// 设置默认展开
  } 
},

mounted中调用执行既可

清除选中

一般输入框或者选择器都有清除功能,我们的组件自然也少不了清除功能,实现思路如下:

  • 给select组件设置clearable属性
  • 给select组件添加清除监听事件
  • 在监听事件中清除tree组件选中,并清除父组件中的值

代码如下:

"valueTitle" :clearable="clearable" @clear="clearHandle" :placeholder="placeholder" ref="select">
// 清除选中
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'))
},

筛选数据

当tree中数据量过大时,我们需要筛选数据,实现思路如下:

  • 给tree组件添加filter-node-method方法
  • 添加一个输入框,输入筛选的内容
  • 监听输入内容变化,并调用tree组件的筛选方法

代码如下:

"valueTitle" :clearable="clearable" @clear="clearHandle" :placeholder="placeholder" ref="select">      class="selectInput"
      placeholder="检索关键字"
      v-model="filterText">"valueTitle" :label="valueTitle" class="options">"tree-option"
        ref="selectTree"
        :accordion="accordion"
        :data="options"
        :props="props"
        :node-key="props.value"    
        :default-expanded-keys="defaultExpandedKey"
        :filter-node-method="filterNode"
        @node-click="handleNodeClick">

.selectInput{
    padding: 0 5px;
    box-sizing: border-box;
}
filterNode(value, data) {
  if (!value) return true;
  return data.name.indexOf(value) !== -1;
}
watch: {
    filterText(val) {
      this.$refs.selectTree.filter(val);
    }
},

这样一个简单的树状下拉框组件就封装好了。

使用组件

下面给个简单的使用示例:

      :props="defaultProps"
      :options="treeData"
      :value="value"
      :accordion="true"
      @getValue="getValue($event)"
      placeholder="请选择所属区域"
    />选中的id:{{value}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字体单独设置样式_Glyphs 官方教程 | 字体命名

​​字体名称是很重要的,它决定了字体菜单中的分组和顺序,而这直接影响你的字体将如何呈现给用户。在一款字体中,字体名称被存储在六个不同的地方,这一点已经相当困难;或者实际上还会有更多的地方,这就更复…

委外订单_ERP软件教程:金蝶ERP的委外加工业务流程(一)

ERP软件教程:金蝶ERP的委外加工业务流程关注我,我将定期分享更多的ERP解决方案转发关注并私信我,了解更多的解决方案及操作方法哦欢迎大家随时咨询关于金蝶ERP的任何问题!一、应用软件版本:金蝶KIS旗舰版6.0二、应用场…

stm32f401 边沿捕获_STM32_capture 基于 设计的输入捕获实验,通过对边沿跳变的采集,得到外部接口 据。 SCM 单片机开发 261万源代码下载- www.pudn.com...

文件名称: STM32_capture下载 收藏√ [5 4 3 2 1 ]所属分类: SCM开发工具: Visual C文件大小: 447 KB上传时间: 2016-07-11下载次数: 0提 供 者: 刀锋意志详细说明:基于STM32设计的输入捕获实验,通过对边沿跳变的采集,得到外部接口的数…

【市场调研与分析】Intel发力移动安全领域——By Me at 20140613

【市场调研与分析】Intel发力移动安全领域 第一部分 Intel收购McAfee情况调研 1.1 Intel收购McAfee综述 2010年8月,英特尔公司以76.8亿美元价格收购安全软件供应商McAfee公司,继续向嵌入式前沿扩张,特别是手机市场。但这笔让人惊讶的交易仍存…

hadoop2 Ubuntu 下安装部署

搭建Hadoop环境( 我以hadoop 2.7.3 为例, 系统为 64bit Ubuntu14.04 ) hadoop 2.7.3 官网下载 , 选择自己要安装的版本。注意每个版本对应两个下载选项source和binary,我们暂时下载binary,我们下载编译好的文件hadoop-2.7.3.tar.gz , 解压后为 hadoop-2.7.3 , 这个可…

idea 多模块build_[史上最详细]springboot创建基于maven的多模块项目

点击蓝字 关注我们 背景项目为什么需要用多模块?springmvc难道还不够我们平常使用吗?设计模式真言:“高内聚、低耦合”,springmvc项目,一般会把项目分成多个包:controller、service、dao、util等&#xff0…

Vue中 $ref 的用法

ref 被用来给DOM元素或子组件注册引用信息。引用信息会根据父组件的 $refs 对象进行注册。如果在普通的DOM元素上使用,引用信息就是元素; 如果用在子组件上,引用信息就是组件实例 注意:只要想要在Vue中直接操作DOM元素,就必须用r…

Nginx服务器之基础学习

一、Nginx介绍 nginx:Nginx是一种软件服务器(轻量级),故它最主要的功能就是可以与服务器硬件结合,我们的应用程序可以放在nginx服务器上进行发布,已达到让网民浏览的效果。除此自外,Nginx是一种…

工作44:阅读代码1 dictionary

dictionary tabmixin 这个是dictionary混入 create里面有混入addedit addedit方法

mysql开启布隆过滤器_海量数据去重之布隆过滤器

背景在使⽤word⽂档时,word如何判断某个单词是否拼写正确?⽹络爬⾍程序,怎么让它不去爬相同的url⻚⾯?垃圾邮件(短信)过滤算法如何设计?公安办案时,如何判断某嫌疑⼈是否在⽹逃名单中?缓存穿透问…

linux 中 svn 服务器搭建 重启

鉴于在搭建时,参考网上很多资料,网上资料在有用的同时,也坑了很多人 本文的目的,也就是想让后继之人在搭建svn服务器时不再犯错,不再被网上漫天的坑爹作品所坑害,故此总结 /******开始*********/ 系统环境&…