- 树形表格的实现问题,官网都是静态数据,实际开发过程中,数据都是动态请求过来的,导致初学者在使用过程中会踩很多坑,就像我,这里记录一下树形表格实现中出现的一些问题。
我们先来看官网中给出的树形表格懒加载实现的例子:
<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 {
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(tree, treeNode, resolve) {
setTimeout(() => {
resolve([
{
id: 31,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}, {
id: 32,
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}
])
}, 1000)
}
},
}
</script>
要实现树形表格懒加载,当前表格的row必须要包含hasChildren字段,当我们动态请求主表行的数据时,可以对数据进行处理,我当时做的是库存明细表,所以每行都必须要树形结构,我们可以对获取的表格数据进行处理,每一行的数据都加上hasChildren: true,这里还要注意的地方是,row-key的值必须是唯一的,不然等会懒加载数据的时候,会缓存,界面不会更新。下面看看详细实现代码:
这样可以实现每一行都是树形表,如果不是每一行都是树形表,可以对行数据就行过滤处理,为需要的行添加hasChildren: true,在这里的时候,就对主表行key进行了处理,保证了row-key的值是唯一的。
这里是对子表的数据增加了key值,并且保证子表数据的row-key值是唯一的。因为有的数据主表显示了,子表不需要显示了,所以有了下面两行代码。这里一定要注意的是,子表数据一定要放在resolve()中,这样才能拿到子表数据。
- 现在来看看实现效果吧:
- 总结: 之所以会出现数据缓存或者说是组件缓存,是取决row-key的值,只要保证每次row-key的值是唯一的,就可以解决页面数据不改变的问题。