elementUI下拉树组件封装
使用组件: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下拉树组件封装的更多相关文章
- iview下拉树组件
iview.vue.jq等自行引用 iview.js和iview.css版本是iview@3.4.2 <!DOCTYPE html> <html lang="en" ...
- 第二百二十七节,jQuery EasyUI,ComboTree(树型下拉框)组件
jQuery EasyUI,ComboTree(树型下拉框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解EasyUI中ComboTree(树型下拉框)组件的使用方法,这个 ...
- layui扩展组件,下拉树多选
项目介绍 项目中需要用到下拉树多选功能,找到两个相关组件moretop-layui-select-ext和wujiawei0926-treeselect,但是moretop-layui-selec ...
- zTree开发下拉树
最近,因为工作需要一个树形下拉框的组件,经过查资料一般有两种的实现方法.其一,就是使用zTree实现:其二,就是使用easyUI实现.因为公司的前端不是使用easyUI设计的,故这里我选择了zTree ...
- JS列表的下拉菜单组件(仿美化控件select)
JS列表的下拉菜单组件(仿美化控件select) 2014-01-23 23:51 by 龙恩0707, 1101 阅读, 6 评论, 收藏, 编辑 今天是农历23 也是小年,在这祝福大家新年快乐!今 ...
- 开源框架.netCore DncZeus学习(五)下拉树的实现
千里之行,始于足下,先从一个小功能研究起,在菜单管理页面有一个下拉树,先研究下它怎么实现的 1.先找到menu.vue页面 惯性思维先搜索请选择三个字,原来是动态生成的 再向上找DropDown组件, ...
- vue-Treeselect实现组织机构(员工)下拉树的功能
知识点:前端使用vuetree的组件库,调用后台查询组织机构,包括人员的接口 实现下拉树的功能 查考: vue-treeselect官网:https://vue-treeselect.js.org/ ...
- Extjs下拉树代码测试总结
http://blog.csdn.net/kunoy/article/details/8067801 首先主要代码源自网络,对那些无私的奉献者表示感谢! 笔者对这些代码做了二次修改,并总结如下: Ex ...
- 打造通用的Android下拉刷新组件(适用于ListView、GridView等各类View)
前言 近期在做项目时,使用了一个开源的下拉刷新ListView组件.极其的不稳定,bug还多.稳定的组件又写得太复杂了,jar包较大.在我的一篇博客中也讲述过下拉刷新的实现,即Android打造(Li ...
随机推荐
- C#WebApi自动生成文档
1.效果图 2.在webApi项目,打开Nuget,搜索WebApiTestClient,安装WebApiTestClient,注意是给HelpPage的 3.打开引入WebApiTestClient ...
- Cyclic Nacklace HDU 3746 KMP 循环节
Cyclic Nacklace HDU 3746 KMP 循环节 题意 给你一个字符串,然后在字符串的末尾添加最少的字符,使这个字符串经过首尾链接后是一个由循环节构成的环. 解题思路 next[len ...
- [集合]Map
Map集合的功能概述 a:添加功能 * V put(K key,V value):添加元素.* 如果键是第一次存储,就直接存储元素,返回null * 如果键不是第一次存在,就用值把以前的值替换掉, ...
- 多线程测试工具groboutils的使用
一直使用junit做为服务测试框架,感觉不错.最近有人反映在高并发的情况下,存在服务调不到.无奈再次打开单元测试模拟高并发的 情况,却发现junit不支持并发测试 引入groboutils ...
- 移动端布局的思考和rem的设置
如下方法如有不正确的地方,欢迎指正 前提: 设置稿750px 目标:40px = 1rem js设置方法:(小于等于750屏幕等比缩放) ;(function (doc, win, undefined ...
- element ui 选择期 传对象
<template> <el-select value-key="label" v-model="value" placeholder=&qu ...
- bak文件恢复成 SQL2005 数据库 的全程讲解
经常会碰到客户给我们发的是一个bak的数据库备份文件,而不是一个数据库.这就需要我们把这数据文件还原成数据库的形式. 如将demo.bak数据库恢复到mssql2005下 打开SQL2005,打开后就 ...
- C#基础知识之GC 垃圾回收
一.托管 .Net所指的托管资源到底是什么意思呢?是相对于所有资源,还是只限于某一方面的资源?很多人对此不是很了解. 其实.Net所指的托管只是针对内存这一个方面,并不是对于所有的元素:因此对于Str ...
- C#基础知识之System.AppDomain类
进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象.一个process可以存在多个AppDomain.各个AppDomain之间的数据时相互独立的.一个线程可以穿梭多个AppD ...
- CF839E Mother of Dragons 最大团 Bron-Kerbosch算法
题意简述 给你一个\(n\)个节点的无向图\(G=\{V,E\}\)的邻接矩阵\(g\)和每个点的点权为\(s_i\),且\(\sum_{i=1}^n s_i = K\),要你求出\(\mathrm{ ...