最佳实践
el-table
实现树形结构主要依靠row-key
和tree-props
来实现的。
💫 无论是el-table
实现的树形结构还是el-tree
组件都是绑定的树形结构的数据,因此如果数据是扁平的话,需要进行树化。
代码
<template>
<div>
<el-table
:data="tableData"
style="width: 100%;margin-bottom: 20px;"
row-key="id"
border
default-expand-all
:tree-props="{children: 'children', hasChildren: 'hasChildren'}">
<el-table-column
prop="date"
label="日期"
sortable
width="180">
</el-table-column>
<el-table-column
prop="name"
label="姓名"
sortable
width="180">
</el-table-column>
<el-table-column
prop="address"
label="地址">
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [{
id: 1,
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
},
{
id: 2,
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
},
{
id: 3,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄',
children: [{
id: 31,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
},
{
id: 32,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}]
}, {
id: 4,
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}]
}
},
methods: {
},
}
</script>
当前视图
可以看到树形结构默认是打开的
核心属性
default-expand-all
:树形结构打开还是关闭。
关闭可以通过删除default-expand-all
或:default-expand-all = 'false'
对属性值进行动态绑定,并将值置为false
。children
:指定子节点数据在父节点对象中的字段名,这里是 children 。
也可以修改为其它名称,但是两处都需要进行修改。hasChildren
:这个属性是非必须的,需要进行懒加载的时候才需要用到它。
hasChildren
需要和lazy
属性、load
属性来实现懒加载,lazy
为true时,load方法才会生效。hasChildren
属性和children
属性相同,也可以修改名称。
懒加载
只加载需要展示的数据,其它数据等用户主动点击才会请求后端拿取。
代码
<template>
<div>
<el-table
:data="tableData1"
style="width: 100%"
row-key="id"
border
lazy
:load="load"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
<el-table-column prop="date" label="日期" width="180">
</el-table-column>
<el-table-column prop="name" label="姓名" width="180">
</el-table-column>
<el-table-column prop="address" label="地址">
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [{
id: 1,
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
},
{
id: 2,
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
},
{
id: 3,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄',
children: [{
id: 31,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
},
{
id: 32,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}]
}, {
id: 4,
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}],
tableData1: [{
id: 1,
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
id: 2,
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}, {
id: 3,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄',
hasChildren: true
}, {
id: 4,
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}]
}
},
methods: {
load(row, treeNode, resolve) {
// 查找对应的父节点
const findChildren = (data, id) => {
for (let item of data) {
console.log(item.id);
if (item.id === id) {
console.log(item.id);
return item.children || [];
}
}
return [];
};
if (treeNode) {
const children = findChildren(this.tableData, row.id);
resolve(children);
} else {
resolve([]);
}
}
},
}
</script>
效果图
到这里
el-table
加载树形结构就结束了。☺️