elementUI-利用Table“展开所有行”的功能扩展行内容

本文介绍了如何使用elementUI Table的展开行功能,解决内容过多的问题。通过设置row-key和expand-row-keys,实现无需手动展开即可显示详细内容。同时,文章提出了一种巧妙的方法隐藏展开图标,保持扩展行的样式完整,并提供了完善样式的技巧,确保逻辑上同一行的数据视觉上保持一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

elementUI-利用Table“展开所有行”的功能扩展行内容

当表格一行内数据过多时,一般可以通过 单元格内换行(定宽后默认)、超长部分隐藏为“…”并用tooltip显示(el-table-column自带show-overflow-tooltip属性),或者直接给表格加滚动条 来解决。
但是当表格中仅单独一列(即某一项)的内容极多、甚至超过其他所有列之和时,这些通用方法就不那么合适了。
element官网给出了展开行的功能。点击小箭头可以展开一个扩展行。
谢绝转载图片

那么当设计要求仅仅是扩展行内容、不想手动展开呢?

看以下原创例子:
谢绝转载图片
实现的vue文件:

<template>
    <div class="pg-container">
        <el-table
                :expand-row-keys="expends"
                :row-key="getRowKeys"
                :data="tableData"
                class="table-class">
            <el-table-column prop="name" label="姓名" show-overflow-tooltip min-width="20%">
            </el-table-column>
            <el-table-column prop="sex" label="性别" show-overflow-tooltip
                             min-width="10%">
            </el-table-column>
            <el-table-column prop="phone" label="联系方式" show-overflow-tooltip width="120">
            </el-table-column>
            <!--注意把带行展开插槽的列元素放在容易隐藏的位置(3)-->
            <el-table-column type="expand" class-name="none-col">
                <template slot-scope="props">
                
                    <!--放扩展行内代码(1)-->
                    
                </template>
            </el-table-column>
            <el-table-column prop="createDate" label="录入时间" show-overflow-tooltip min-width="30%">
            </el-table-column>
        </el-table>
    </div>
</template>

<script>
    export default {
        mounted() {
            this.getTableData();
        },
        data() {
            return {
                //展开行
                expends: [],
                //表数据
                tableData: [],
                testData: [
                   //测试表数据,略
                ]
            }
        },
        methods: {
            //获取表格的行id
            getRowKeys(row) {
                return row.id
            },
            //模拟获取表数据的异步函数
            getTableData() {
                let _this = this;
                setTimeout(function () {
                    _this.tableData = _this.testData;

                    //设置table中的扩展项-展开行的id(全部展开)(2)
                    let rowIds = _this.tableData.map(item => {
                        return item.id
                    });
                    _this.expends = rowIds;
                }, 2000);
            }
        }
    }
</script>
<style>
    .pg-container .table-class td.none-col .el-table__expand-icon--expanded {
        /*只能隐藏内容,隐藏整个的单元格要另想办法(3)*/
        display: none;
    }
    
    .pg-container .table-class td {
        /*注意是每个单元格有自己的下边框(4)*/
        border-bottom: unset;
    }

    .pg-container .table-class .el-table__expanded-cell {
        padding: 6px 10px 12px 10px;
         /*补上扩展行的下边框(4)*/
        border-bottom: 1px solid #ebeef5;
    }
    
	/* ......其他CSS省略*/

</style>
    

详解:

(对应代码见代码段中对应标号(1)(2)…处。)

(1)首先确认使用行展开功能、放下我们希望单独列出的过长的内容(注意type="expand"是必须的)
谢绝转载图片

(2)我们希望扩展行作为表自然的一部分、免去手动一行行展开的麻烦。
先用的row-key属性设定所有行的行id,再放入设置 Table 目前的展开行的expand-row-keys中:

        <el-table
                :expand-row-keys="expends"
                :row-key="getRowKeys"
                :data="tableData"
                border
                class="table-class">
//获取表格的行id
getRowKeys(row) {
	return row.id
},
//设置table中的扩展项-展开行的id(全部展开)
let rowIds = _this.tableData.map(item => {
    return item.id
});
_this.expends = rowIds;

实际应用中表数据可能来自于异步函数的回调方法。拿到表数据之后再进行以上操作。

注意:回调方法中this的指向可能已经不是当前的vue对象,例子中用_this指代了。

(3)既然我们只需要扩展行内容、不需要“展开”和“收起”的操作,那个小箭头就不再需要了。但它的隐藏是个麻烦的问题。
实际上表格的渲染不是一下子完成的,默认表格的宽度是单元格们撑起来的。单纯的把这一列设定display: none、或者设宽度为0都是不行的,因为边框和扩展行会按它还在的宽度来显示。如果用v-if来控制、插槽中扩展行的内容也会一起消失。
谢绝转载图片
这里纠结了很久之后,我想到了用“假装隐藏”的方法来解决。用户观看的逻辑和写代码的逻辑往往是不同的,“看起来实现了功能”的伪装方法还挺常用的😁当然如果有大佬有更好的解决办法也可以发出来讨论,我也学习一下~
我的解决办法:
将插槽列放在一个能确定宽度的列后面,隐藏箭头图标并去掉border,让两列融为一体~
谢绝转载图片
联系方式这一类宽度在业务上是能确定的、也不会有过长显示tooltip的问题,所以把插槽列藏在这列后面~
现在功能已经基本实现啦!

(4)完善样式,将逻辑上作为同一行的数据放在一起。
这里注意,el-table中下边框是写在单元格td (和th)上的,用border-bottom: unset把组件样式顶掉、再给扩展行补上下边框,就完成了~

 .pg-container .table-class td {
     border-bottom: unset;
 }
 .pg-container .table-class .el-table__expanded-cell {
     padding: 6px 10px 12px 10px;
     border-bottom: 1px solid #ebeef5;
 }

只是一个利用组件灵活运用实现需求的小栗子,不过第一次接触的时候还是挺容易把人绕住的。el-table的复杂应用不多,值得记录一下😊

示例图片里的小图标样式用在我的项目里了(代码没有放出),所以图片拒绝拿走哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值