您好,登录后才能下订单哦!
在现代Web开发中,表格是展示数据的重要组件之一。随着数据复杂性的增加,传统的扁平表格已经无法满足需求,树形表格应运而生。树形表格不仅能够展示层级结构的数据,还能通过展开和折叠操作来动态显示或隐藏子层级数据。ElementUI作为一款流行的Vue.js组件库,提供了强大的树形表格组件,本文将详细介绍如何在ElementUI中实现树形表格,并探讨如何切换展开不同层级。
ElementUI是一套为开发者、设计师和产品经理准备的基于Vue.js的桌面端组件库。它提供了丰富的组件,如按钮、表单、表格、对话框等,帮助开发者快速构建高质量的Web应用。ElementUI的设计风格简洁、易用,且具有良好的文档和社区支持,因此在Vue.js生态系统中广受欢迎。
树形表格是一种特殊的表格形式,它能够展示具有层级结构的数据。与传统的扁平表格不同,树形表格的每一行可以包含子行,子行可以进一步展开或折叠。这种结构非常适合展示如组织结构、文件目录、分类目录等具有层级关系的数据。
ElementUI提供了el-table
组件,通过配置tree-props
属性,可以轻松实现树形表格。tree-props
属性用于指定树形结构的配置,包括子节点的字段名、是否懒加载等。
el-table
组件的基本用法<template>
<el-table
:data="tableData"
row-key="id"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="date" label="日期"></el-table-column>
<el-table-column prop="address" label="地址"></el-table-column>
</el-table>
</template>
<script>
export default {
data() {
return {
tableData: [
{
id: 1,
name: '一级 1',
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 11,
name: '二级 1-1',
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄'
}
]
},
{
id: 2,
name: '一级 2',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 21,
name: '二级 2-1',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄'
},
{
id: 22,
name: '二级 2-2',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 221,
name: '三级 2-2-1',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄'
}
]
}
]
}
]
}
}
}
</script>
tree-props
属性详解children
:指定子节点的字段名,默认为children
。hasChildren
:指定是否具有子节点的字段名,默认为hasChildren
。如果该字段为true
,则表示该节点具有子节点,可以展开。el-table
:使用tree-props
属性指定子节点的字段名。el-table-column
组件定义表格的列。el-table
的事件和方法来控制节点的展开与折叠。在实际应用中,我们可能需要根据用户的操作或业务需求,动态切换展开或折叠不同层级的节点。ElementUI提供了多种方法来实现这一功能。
expand-row-keys
属性expand-row-keys
属性用于控制哪些行是展开的。通过动态修改该属性的值,可以实现对不同层级节点的展开与折叠。
<template>
<div>
<el-button @click="expandAll">展开所有</el-button>
<el-button @click="collapseAll">折叠所有</el-button>
<el-table
:data="tableData"
row-key="id"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
:expand-row-keys="expandedRows"
>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="date" label="日期"></el-table-column>
<el-table-column prop="address" label="地址"></el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [
{
id: 1,
name: '一级 1',
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 11,
name: '二级 1-1',
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄'
}
]
},
{
id: 2,
name: '一级 2',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 21,
name: '二级 2-1',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄'
},
{
id: 22,
name: '二级 2-2',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 221,
name: '三级 2-2-1',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄'
}
]
}
]
}
],
expandedRows: []
}
},
methods: {
expandAll() {
this.expandedRows = this.getAllIds(this.tableData)
},
collapseAll() {
this.expandedRows = []
},
getAllIds(data) {
let ids = []
data.forEach(item => {
ids.push(item.id)
if (item.children && item.children.length > 0) {
ids = ids.concat(this.getAllIds(item.children))
}
})
return ids
}
}
}
</script>
toggleRowExpansion
方法toggleRowExpansion
方法用于手动切换某一行的展开状态。通过遍历表格数据,可以动态展开或折叠指定层级的节点。
<template>
<div>
<el-button @click="expandLevel(1)">展开一级</el-button>
<el-button @click="expandLevel(2)">展开二级</el-button>
<el-button @click="collapseAll">折叠所有</el-button>
<el-table
ref="table"
:data="tableData"
row-key="id"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="date" label="日期"></el-table-column>
<el-table-column prop="address" label="地址"></el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [
{
id: 1,
name: '一级 1',
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 11,
name: '二级 1-1',
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄'
}
]
},
{
id: 2,
name: '一级 2',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 21,
name: '二级 2-1',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄'
},
{
id: 22,
name: '二级 2-2',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 221,
name: '三级 2-2-1',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄'
}
]
}
]
}
]
}
},
methods: {
expandLevel(level) {
this.$refs.table.data.forEach(row => {
this.toggleRowExpansion(row, level, 1)
})
},
collapseAll() {
this.$refs.table.data.forEach(row => {
this.$refs.table.toggleRowExpansion(row, false)
})
},
toggleRowExpansion(row, targetLevel, currentLevel = 1) {
if (currentLevel < targetLevel) {
this.$refs.table.toggleRowExpansion(row, true)
if (row.children && row.children.length > 0) {
row.children.forEach(child => {
this.toggleRowExpansion(child, targetLevel, currentLevel + 1)
})
}
}
}
}
}
</script>
lazy
属性实现懒加载对于数据量较大的树形表格,可以使用lazy
属性实现懒加载。懒加载可以在用户展开节点时动态加载子节点数据,减少初始加载时间。
<template>
<el-table
:data="tableData"
row-key="id"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
:load="load"
lazy
>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="date" label="日期"></el-table-column>
<el-table-column prop="address" label="地址"></el-table-column>
</el-table>
</template>
<script>
export default {
data() {
return {
tableData: [
{
id: 1,
name: '一级 1',
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄',
hasChildren: true
},
{
id: 2,
name: '一级 2',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
hasChildren: true
}
]
}
},
methods: {
load(tree, treeNode, resolve) {
setTimeout(() => {
resolve([
{
id: tree.id * 10 + 1,
name: `二级 ${tree.id}-1`,
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄'
},
{
id: tree.id * 10 + 2,
name: `二级 ${tree.id}-2`,
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
hasChildren: true
}
])
}, 1000)
}
}
}
</script>
<template>
<el-table
:data="tableData"
row-key="id"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="date" label="日期"></el-table-column>
<el-table-column prop="address" label="地址"></el-table-column>
</el-table>
</template>
<script>
export default {
data() {
return {
tableData: [
{
id: 1,
name: '一级 1',
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 11,
name: '二级 1-1',
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄'
}
]
},
{
id: 2,
name: '一级 2',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 21,
name: '二级 2-1',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄'
},
{
id: 22,
name: '二级 2-2',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 221,
name: '三级 2-2-1',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄'
}
]
}
]
}
]
}
}
}
</script>
<template>
<div>
<el-button @click="expandAll">展开所有</el-button>
<el-button @click="collapseAll">折叠所有</el-button>
<el-table
:data="tableData"
row-key="id"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
:expand-row-keys="expandedRows"
>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="date" label="日期"></el-table-column>
<el-table-column prop="address" label="地址"></el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [
{
id: 1,
name: '一级 1',
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 11,
name: '二级 1-1',
date: '2023-01-01',
address: '上海市普陀区金沙江路 1518 弄'
}
]
},
{
id: 2,
name: '一级 2',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 21,
name: '二级 2-1',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄'
},
{
id: 22,
name: '二级 2-2',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄',
children: [
{
id: 221,
name: '三级 2-2-1',
date: '2023-01-02',
address: '上海市普陀区金沙江路 1518 弄'
}
]
}
]
}
],
expandedRows: []
}
},
methods: {
expandAll() {
this.expandedRows = this.getAllIds(this.tableData)
},
collapseAll() {
this.expandedRows = []
},
getAllIds(data) {
let ids = []
data.forEach(item => {
ids.push(item.id)
if (item.children && item.children.length > 0) {
ids = ids.concat(this.getAllIds(item.children))
}
})
return ids
}
}
}
</script>
”`vue
<el-table-column prop="name
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。