vue elementui 复杂表头 table
·
文章目录
一、 效果展示
- 表头由多行多列组成
- 左侧和右侧部分列固定,中间部分为动态列
- 表头合并列、合并行
二、实现方法
elementUI
<el-table-column>
嵌套、rowspan
动态设置来实现复杂表格
参考网上案例,并结合实际情况。可在header-cell-style
回调中,对表格行进行渲染。
1、 表头可理解为三部分: left
, center
,right
2、 left
部分
-
<el-table-column>
多层嵌套,达到以下效果
-
header-cell-style
回调中,第一行,第一列设置rowspan='3'
-
header-cell-style
回调中,隐藏第一列的第二行和第三行(不影响center
部分展示)。
3、 center
部分
<el-table-column>
多层嵌套,达到以下效果
- 堆叠其余部分。
- 动态列部分
v-for
加载多个<el-table-column>
即即可。
4、 right
部分和 left
相似处理。
5、 动态设置 rowspan (解决图层覆盖问题)
当 设置 fixed 时,表格会在原表格的基础上再新增一个图层
图层属性大部分和原表格的相同,动态设置 rowspan 部分需要再新图层添加
<el-table-column>
中设置fixed
为true\left\right
。并且设置width
- 子组件
<el-table-column>
内部同样设置fixed
和width
- 如果父组件
<el-table-column>
有多列,则子<el-table-column>
width 之和为父组件的width
三、完整实例代码
1、 Html 做多层嵌套
<el-table
:data="tableData"
style="width: 100%"
ref="tableRef"
:header-cell-style="rowspanStyle"
>
<!-- left -->
<el-table-column label="label-left" width="300" fixed="left">
<el-table-column label="left-label" width="300" fixed="left">
<el-table-column label="left-label" width="300" fixed="left">
<el-table-column label="A" prop="key1" width="100" fixed="left"></el-table-column>
<el-table-column label="B" prop="key2" width="100" fixed="left"></el-table-column>
<el-table-column label="C" prop="key3" width="100" fixed="left"></el-table-column>
</el-table-column>
</el-table-column>
</el-table-column>
<!-- center -->
<el-table-column label="G" width="80" fixed="left">
<el-table-column label="F" width="80" fixed="left">
<el-table-column label="E" width="80" fixed="left">
<el-table-column label="D/E" prop="key4" width="80" fixed="left"></el-table-column>
</el-table-column>
</el-table-column>
</el-table-column>
<el-table-column label="center-label-2">
<el-table-column label="label-2">
<el-table-column label="G">
<el-table-column label="H" prop="key5" min-width="150"></el-table-column>
</el-table-column>
</el-table-column>
</el-table-column>
<el-table-column label="center-label-3">
<el-table-column label="label-3">
<el-table-column label="G">
<el-table-column label="H" prop="key6" min-width="150"></el-table-column>
</el-table-column>
</el-table-column>
</el-table-column>
<el-table-column label="center-label-4">
<el-table-column label="label-4">
<el-table-column label="G">
<el-table-column label="H" prop="key7" min-width="150"></el-table-column>
</el-table-column>
</el-table-column>
</el-table-column>
<el-table-column label="center-label-3">
<el-table-column label="label-3">
<el-table-column label="G">
<el-table-column label="H" prop="key6" min-width="150"></el-table-column>
</el-table-column>
</el-table-column>
</el-table-column>
<!-- right -->
<el-table-column label="right-label" width="100" fixed="right">
<el-table-column label="X" width="100" fixed="right">
<el-table-column label="W" width="100" fixed="right">
<el-table-column label="/" align="center" prop="key8" width="100" fixed="right"></el-table-column>
</el-table-column>
</el-table-column>
</el-table-column>
</el-table>
2、 数据模拟&图层覆盖问题
data() {
return {
tableData: [{
key1: '2021-10-02',
key2: '王小虎',
key3: '上海',
key4: '10',
key5: '30',
key6: 30,
key7: 30,
key8: '100%'
}],
}
},
methods: {
rowspanStyle({row,column,rowIndex,columnIndex}) {
this.$nextTick(() => {
if(rowIndex === 0) {
if(
columnIndex === 0
|| columnIndex == (row.length-1)
) {
// fixed 固定表格,会在表格上方覆盖一层 相同结构的列
// 因此 将覆盖的表格 列上也需添加 rowspan="3" 属性
const domColumn = document.getElementsByClassName(column.id);
for(let item of domColumn) {
item.setAttribute("rowSpan",3);
}
return column;
}
}
// fixed="right" 原表格和 覆盖层同时出现,将原表层内容隐藏
if(rowIndex === 3 ){
if(columnIndex === (row.length -1)) {
console.log(document.getElementsByClassName(column.id));
document.getElementsByClassName(column.id)[0].childNodes[0].style.visibility = "hidden"
}
}
});
// 最后一列设置 rowspan="3" 会空出两行,因此隐藏空出的两行
if(rowIndex>0 && rowIndex < 3 ) {
if(
columnIndex ===0
|| columnIndex === (row.length-1)
) {
return {display:"none"}
}
}
},
}
四、为什么嵌套多层<el-table-column>
1、普通表格的合并行和列
- 合并行
<!-- 合并行 -->
<table class="example-table">
<tr>
<td rowspan="2">A</td>
<td>B</td>
</tr>
<tr>
<td>D</td>
</tr>
</table>
- 合并列
<!-- 合并列 -->
<table class="example-table">
<tr>
<td colspan="2">A</td>
</tr>
<tr>
<td>C</td>
<td>D</td>
</tr>
</table>
2、elementUI 表格合并行、列
官方样例中,配送信息 列实现了合并两行,姓名 行实现了合并两列。
但从代码的实现方式来看,只能实现简单的嵌套方式合并。针对更复杂表格力不从心。
<!-- 合并行 -->
<el-table-column label="配送信息">
<!-- 合并列 -->
<el-table-column
prop="name"
label="姓名"
width="120">
</el-table-column>
<el-table-column label="地址">
<el-table-column
prop="province"
label="省份"
width="120">
</el-table-column>
<el-table-column
prop="city"
label="市区"
width="120">
</el-table-column>
</el-table-column>
</el-table-column>
五、 参考资料
更多推荐
已为社区贡献2条内容
所有评论(0)