使用组件:Popover 弹出框、Tree 树形控件 和 input 输入框

用法:

  1、新建一个.vue文件,粘贴以下组件封装的代码(完全可以使用)

  2、在页面需要使用下拉树的地方调用即可。

  (1)import selectTree from '@/components/selectTree/selectTree'

  (2)components: {selectTree}

  (3)页面调用

组件封装代码:

 <template>
<div v-if="update">
<el-popover
popper-class="selectTree"
placement="bottom-start"
transition="fade-in-linear"
v-model="visible"
min-width="200"
trigger="click">
<el-tree
:data="data"
:props="defaultProps"
empty-text="无数据"
:node-key="defaultProps.id"
:default-expanded-keys="defaultExpandedKeys"
:check-on-click-node="true"
ref="tree1"
:expand-on-click-node="false"
:filter-node-method="filterNode"
:highlight-current="true"
@node-click="handleNodeClick">
</el-tree>
<el-input
v-model="filterText"
@clear="clear"
:placeholder="placeholder"
:disabled="disabled"
slot="reference"
:clearable="clearable"
:suffix-icon="icon">
</el-input>
</el-popover>
</div>
</template>
<script>
export default {
name: 'selectTree',
props: {
value: String,
data: Array,
placeholder: {
type: String,
default: '请选择'
},
disabled: {
type: Boolean,
default: false,
},
clearable: {
type: Boolean,
default: true,
},
filterable: { //禁选值
type: String,
default: undefined,
},
defaultProps: {
type: Object,
default() {
return {
children: 'children',
label: 'label',
id: 'id',
}
}
},
nodeKey: {
type: String,
default: 'id',
}
},
data() {
return {
defaultExpandedKeys: ['-1'], //默认展开
filterText: '',
visible: false,
icon: 'el-icon-arrow-down',
update: true,
}
},
async created() {
if (this.filterable) {
this.setFilter(this.data)
}
},
mounted() {
this.setFilterText()
},
watch: {
value(val) {
if (!val) { //没有值得时候
this.filterText = ''
} else {
if (this.$refs.tree1) {
this.$refs.tree1.setCurrentKey(val)
let obj = this.$refs.tree1.getCurrentNode()
if (obj) {
this.filterText = obj[this.defaultProps.label]
return
} else {
let tree = this.$refs.tree1
this.$nextTick(() => {
tree.setCurrentKey(val)
let obj = tree.getCurrentNode()
if (obj) {
this.filterText = obj[this.defaultProps.label]
}
return
})
}
}
}
},
visible(val) {
if (val === true) {
this.icon = "el-icon-arrow-up"
} else {
this.icon = "el-icon-arrow-down"
}
},
filterable(val) {
this.update = false
this.setFilter(this.data)
this.$nextTick(() => {
this.update = true
})
}
},
methods: {
setFilterText() {
if (!this.value) {
return
} else {
this.$refs.tree1.setCurrentKey(this.value)
let obj = this.$refs.tree1.getCurrentNode()
if (obj) {
this.filterText = obj[this.defaultProps.label]
}
}
},
setFilter(arr) {
arr.map(item => {
if (item.id === this.filterable) {
item.disabled = true
if (item.children && item.children.length != 0) {
this.setDisabled(item.children)
}
} else {
item.disabled = false
if (item.children && item.children.length != 0) {
this.setFilter(item.children)
} }
})
},
setDisabled(arr) {
arr.map(item => {
item.disabled = true
if (item.children && item.children.length != 0) {
this.setDisabled(item.children)
}
}) },
filterNode(value, data) {
if (!value) return true;
return data.label.indexOf(value) !== -1;
},
handleNodeClick(obj, node) {
if (node.data.disabled === true || this.disabled === true) {
return
}
this.$refs.tree1.setCurrentKey(obj[this.defaultProps.id])
this.$emit('input', obj[this.defaultProps.id])
this.filterText = obj[this.defaultProps.label]
this.visible = false
},
clear() {
this.$refs.tree1.setCurrentKey('')
this.$emit('input', '')
}
},
beforeDestroy() {
},
destroyed() {
}
} </script>
<style lang="scss">
.selectTree {
max-height: 600px;
overflow-y: auto;
overflow-x: hidden; div[aria-disabled="true"] {
.el-tree-node__content {
cursor: not-allowed;
}
}
} </style>

  

组件封装代码

 <selectTree
:data="treeDataSelect"
:defaultProps="{children:'children',label:'name',id:'id'}"
:filterable="addDirForm.id"
v-model="addDirForm.parentId">
</selectTree>

其中treeDataSelect的数据格式如下所示

 [
{
"id":"527AF5EB3A6A463294181DBE13E36CD7",
"parentId":"-1",
"dirType":0,
"dirName":"test",
"children":[
{
"id":"434051D4A7F5459FADCEC3A3BE79F83F",
"parentId":"527AF5EB3A6A463294181DBE13E36CD7",
"dirType":0,
"dirName":"testChild",
"children":null,
"label":null,
"name":"testChild"
}
],
"label":null,
"name":"test"
}
]

效果截图

elementUI下拉树组件封装的更多相关文章

  1. iview下拉树组件

    iview.vue.jq等自行引用 iview.js和iview.css版本是iview@3.4.2 <!DOCTYPE html> <html lang="en" ...

  2. 第二百二十七节,jQuery EasyUI,ComboTree(树型下拉框)组件

    jQuery EasyUI,ComboTree(树型下拉框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解EasyUI中ComboTree(树型下拉框)组件的使用方法,这个 ...

  3. layui扩展组件,下拉树多选

      项目介绍 项目中需要用到下拉树多选功能,找到两个相关组件moretop-layui-select-ext和wujiawei0926-treeselect,但是moretop-layui-selec ...

  4. zTree开发下拉树

    最近,因为工作需要一个树形下拉框的组件,经过查资料一般有两种的实现方法.其一,就是使用zTree实现:其二,就是使用easyUI实现.因为公司的前端不是使用easyUI设计的,故这里我选择了zTree ...

  5. JS列表的下拉菜单组件(仿美化控件select)

    JS列表的下拉菜单组件(仿美化控件select) 2014-01-23 23:51 by 龙恩0707, 1101 阅读, 6 评论, 收藏, 编辑 今天是农历23 也是小年,在这祝福大家新年快乐!今 ...

  6. 开源框架.netCore DncZeus学习(五)下拉树的实现

    千里之行,始于足下,先从一个小功能研究起,在菜单管理页面有一个下拉树,先研究下它怎么实现的 1.先找到menu.vue页面 惯性思维先搜索请选择三个字,原来是动态生成的 再向上找DropDown组件, ...

  7. vue-Treeselect实现组织机构(员工)下拉树的功能

    知识点:前端使用vuetree的组件库,调用后台查询组织机构,包括人员的接口 实现下拉树的功能 查考: vue-treeselect官网:https://vue-treeselect.js.org/ ...

  8. Extjs下拉树代码测试总结

    http://blog.csdn.net/kunoy/article/details/8067801 首先主要代码源自网络,对那些无私的奉献者表示感谢! 笔者对这些代码做了二次修改,并总结如下: Ex ...

  9. 打造通用的Android下拉刷新组件(适用于ListView、GridView等各类View)

    前言 近期在做项目时,使用了一个开源的下拉刷新ListView组件.极其的不稳定,bug还多.稳定的组件又写得太复杂了,jar包较大.在我的一篇博客中也讲述过下拉刷新的实现,即Android打造(Li ...

随机推荐

  1. C语言数组名取地址。。。

    int main(){ int a[5] = { 1, 2, 3, 4, 5 }; printf("%08X ,%08X ,%08X ,%08X", a, &a, a + ...

  2. homestead修改php版本

    登录后 如果之前没有设置过root密码 sudo passwd root 以root 权限执行如下命令,选择对应php版本 # 查看所有 php 版本和当前版本 update-alternatives ...

  3. 6-2 如何读写json数据

    通过查看help(json.dump)和help(json.dumps)帮助信息,dump是将转换格式到文件对象,而dumps转换格式到字符串. 一.Json.dumps() Json.dumps() ...

  4. 我的第一个Delphi DLL

    library dd; { 使用字符串参数或嵌套字符串参数需要在uses子句中包括sharemm单元,并将BorlandMM.dll与您的应用程序一起发布. 否则需要对参数值使用PChar或Short ...

  5. java体系中OOP,OOD,OOA分别代表什么含义,以及OA,CRM,ERP

    OOP:Object Oriented Programming 面向对象程序设计. OOD:Object Oriented Design 面向对象设计. OOA:Object Oriented Ana ...

  6. 锋利的JS解读——认识JQuery(一)

    一.jQuery的发展 随着javascript的不断发展,延伸出了多种JS程序库,当前比较流行的js库有:1)Prototype  成型较早,从整体上对面向对象的编程思想把握的不是很到位. 2)Do ...

  7. 3.css3中多个背景图片的用法

    (background-clip裁剪,background-position位置,background-origin定位,background-repeat是否重复) <!DOCTYPE htm ...

  8. 解决Chrome浏览器无法自动播放音频视频的问题,Uncaught (in promise) DOMException

    转载自:http://www.nooong.com/docs/chrome_video_autoplay.htm 在最新版的Chrome浏览器(以及所有以Chromium为内核的浏览器)中,已不再允许 ...

  9. IDEA tomcat热部署方法

    项目开发过程中,我们一般希望在修改完代码之后不重启项目即可提现出修改的结果,那么热部署项目就显得十分必要了.在idea中将项目热部署至tomcat中的方法如下: 首先打开tomcat配置界面,在ser ...

  10. nmap 扫描出某网段内web服务器

    今天碰到一个问题,客户要求在他们内网中扫描出所有web服务器,然后再对web进行渗透测试,共两个网段. 以前我记得用nmap时曾得到过某地址的web服务器数据,比如显示是IIS或apach,但忘了具体 ...