Vue和Element-UI是目前非常流行的前端框架,在前端开发中可以提高开发效率,提供了很多方便快捷的API,今天我们来探讨如何使用Vue和Element-UI实现树形结构的数据展示。
1. Element-UI的基本概念
Element-UI是一套基于Vue.js 2.0的桌面端组件库,是由饿了么前端团队开发维护的一个开源项目,提供了丰富的PC端组件,包括表格、表单、弹窗、菜单、导航等等。使用Element-UI可以快速搭建一个漂亮、易用、高性能的PC端界面。
2. 树形结构数据的展示
树形结构是一种常见的数据结构,在前端开发中也经常用到。我们将树形数据展示在网页上,一般采用嵌套列表的方式,通过缩进或者图标来表示层级关系。在Vue和Element-UI中,展示树形数据可以采用el-tree
组件。
2.1 el-tree组件的基本使用
el-tree
是Element-UI中的树形组件,具有很好的交互性和扩展性。在使用前需要先引入Element-UI库和Vue库。
下面是一个最基本的使用例子:
//引入Element-UI组件库和Vue库
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
// Vue组件定义
export default {
data () {
return {
// 树形数据
treeData: [
{
label: '一级 1',
children: [
{
label: '二级人员 1-1',
children: [
{
label: '三级人员 1-1-1'
},
{
label: '三级人员 1-1-2'
}
]
},
{
label: '二级人员 1-2',
children: [
{
label: '三级人员 1-2-1'
},
{
label: '三级人员 1-2-2'
}
]
}
]
}
]
}
},
// 模板
template: `
<div class="myTree">
<el-tree
:data="treeData">
</el-tree>
</div>
`
}
以上代码中,我们定义了一个Vue组件,包括一个树形数据treeData
和一个el-tree
组件。通过el-tree
组件的:data
属性来传递树形数据,组件会自动解析并显示树形结构。
2.2 el-tree组件的高级使用
在实际开发中,我们可能需要对el-tree
组件进行定制化配置,包括:
- 自定义节点内容
- 显示图标
- 多选/单选
- 可拖拽排序
- 异步加载节点等
下面我们将针对这些需求展开讨论。
2.2.1 自定义节点内容
el-tree
组件默认根据数据的label
属性来展示节点内容,但是我们也可以根据需要自己定义节点的展示内容。
例如,我们需要在节点前面显示一个图标,可以通过el-tree
组件的scopedSlots
属性来自定义节点内容:
//定义模板
<template slot-scope="props">
<span class="el-tree-node__icon el-icon-user"></span>
<span class="el-tree-node__label">{{ props.label }}</span>
</template>
//将模板作为el-tree的插槽使用
<el-tree :data="treeData">
<template slot="label" slot-scope="props">
<span class="el-tree-node__icon el-icon-user"></span>
<span class="el-tree-node__label">{{ props.label }}</span>
</template>
</el-tree>
以上代码中,我们通过slot-scope="props"
来获取节点数据props
,并根据需要自定义节点展示内容。
2.2.2 显示图标
在树形结构中,经常需要显示节点类型,例如文件夹、文件等。这时可以通过el-tree
组件的props
属性来定制节点的图标。
例如,我们可以通过props
属性将文件夹节点的图标设置为el-icon-folder
,文件节点的图标设置为el-icon-document
:
// 定义props
<el-tree :data="treeData" :props="treeProps"></el-tree>
// 设置treeProps
export default {
data () {
return {
treeData: [
{
label: '文件夹1',
children: [
{
label: '文件1'
},
{
label: '文件2'
}
]
},
{
label: '文件夹2',
children: [
{
label: '文件3'
},
{
label: '文件4'
}
]
}
],
treeProps: {
children: 'children',
label: 'label',
isLeaf: node => node.type === 'file',
icon: node => node.type === 'folder' ? 'el-icon-folder' : 'el-icon-document'
}
}
}
}
以上代码中,我们通过treeProps
对象来自定义节点的props
属性,其中children
表示子节点的数组属性名,label
表示节点名称的属性名。通过isLeaf
属性判断节点是否是叶子节点,如果是文件类型节点则返回true
,如果是文件夹类型节点则返回false
。通过icon
属性根据节点类型返回不同的图标样式。
2.2.3 多选/单选
el-tree
组件支持多选和单选两种选择模式。通过show-checkbox
属性来控制是否显示多选框,el-tree
会根据选择模式来返回选中的节点或者节点的key。
// 多选模式
<el-tree :data="treeData" show-checkbox check-strictly></el-tree>
// 单选模式
<el-tree :data="treeData" :props="props" node-key="id" highlight-current></el-tree>
以上代码中,el-tree
组件的show-checkbox
属性为true
时表示开启多选模式。另外,check-strictly
表示选中节点时是否关联子节点。
如果要开启单选模式,则需要设置node-key
属性,这个属性是每个节点的唯一标识。在单选模式下,el-tree
会根据给定的标识来返回选中的节点。
2.2.4 可拖拽排序
除了默认的节点展开和收起,我们可能还需要节点的拖拽排序功能。el-tree
组件提供了draggable
属性来开启拖拽排序功能。开启后,可以通过拖拽节点来改变节点的层级关系或者改变节点在同级别节点的位置。
//开启可拖拽排序
<el-tree :data="draggableData" draggable></el-tree>
以上代码中,el-tree
组件的draggable
属性为true
时表示开启可拖拽排序功能。需要注意的是,如果树形数据的节点层级较多,开启拖拽排序时会增加用户操作的复杂度,此时需要慎重考虑开启与否。
2.2.5 异步加载节点
在实际开发中,我们可能需要在节点展开时动态加载子节点数据。el-tree
组件提供了lazy
属性来支持异步加载节点功能。开启异步加载后,el-tree
会在展开节点时触发load
方法回调,将节点的信息传递给回调函数。回调函数需要返回一个Promise对象,在Promise对象resolve()时返回子节点数据并展示。
//开启异步加载
<el-tree
:lazy="true"
:load="loadNode"
:data="treeData">
</el-tree>
//异步加载树形结构
loadNode(node, resolve) {
if (node.level === 0) {
return resolve([{ label: '一级节点1', children: [], isLeaf: false }])
} else if (node.level === 1) {
return resolve([{ label: '二级节点1', children: [], isLeaf: false }])
}
return resolve([])
}
以上代码中,el-tree
组件的lazy
属性为true
时表示开启异步加载功能,开启后需要设置load
属性为一个回调函数。当节点展开时,会触发load
函数,并将节点信息node
和一个resolve
函数作为参数传递给回调函数。回调函数需要返回一个Promise对象,在Promise对象resolve()时返回子节点数据并展示。
3. 总结
本文主要介绍了如何使用Vue和Element-UI实现树形结构的数据展示,并讨论了el-tree
组件的基本用法和高级用法,包括自定义节点内容、显示图标、多选/单选、可拖拽排序和异步加载节点等。希望本文能够帮助读者更好地掌握Vue和Element-UI框架的使用。