使用组件: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. FHJ学长的心愿 QDUOJ 数论

    FHJ学长的心愿 原题链接,点我进去 题意 给你一个数N,让你求在\[C^{0}_{n} \ C^{1}_{n}\ C^{2}_{n}\ \dots \ C^{n}_{n}\]中有几个组合数是奇数. ...

  2. uboot环境变量

    一. uboot运行时环境变量分布 1.1. 环境变量有2份,一份在Flash中,另一份在DDR中.uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中 ...

  3. P-残缺的棋盘

    Input 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, ...

  4. package.json的所有配置项及其用法,你都熟悉么

    写在前面 在前端开发中,npm已经是必不可少的工具了.使用npm,不可避免的就要和package.json打交道.平时package.json用得挺多,但是没有认真看过官方文档.本文结合npm官方文档 ...

  5. 使用electron实现百度网盘悬浮窗口功能!

    相关依赖 里面使用了vuex vue vue-route storeJs storeJs 用来持久化vuex状态 展示 介绍说明 没有使用electron内置的-webkit-app-region: ...

  6. maven多模块tomcat启动报 NoClassDefFoundError:com/test/main/message

    maven多模块tomcat启动报 NoClassDefFoundError:com/test/main/message 扫描不到 添加子模块jar包

  7. 关于jsp删除成功,添加成功等之后 页面自动跳转的js写法

    因为比较常用,所以写在博客里保存起来,防止以后忘了不会写了: 删除成功,<span id="time" style="background:red"> ...

  8. ubuntu下docker安装

    首先来一个官网安装教程链接:https://docs.docker.com/install/linux/docker-ce/ubuntu/ 目前docker主要有docker-CE 与 docker- ...

  9. 【原】cmdline传递参数 uboot-->kernel-->fs

    在uboot中设置bootargs环境变量,在kernel启动后cat /proc/cmdline可以看到bootargs的值. U-boot的环境变量值得注意的有两个: bootcmd 和boota ...

  10. evpp心跳机制

    client server xin good