el-table实现合并表格(每行下方追加备注)

代码实现
<template>
    <el-table :data="processedData" :span-method="handleSpan" border @selection-change="handleSelectionChange"
        style="width: 100%">
        <!-- 复选框列 -->
        <el-table-column type="selection" width="55" align="center" />

        <!-- 图片列 -->
        <el-table-column label="图片" width="120" align="center">
            <template #default="{ row }">
                <img v-if="row.type === 'data'" :src="row.img" style="width: 80px; height: 60px; object-fit: cover;" />
            </template>
        </el-table-column>

        <!-- 动态其他列 -->
        <el-table-column v-for="(col, index) in columns" :key="index" :label="col.label" :prop="col.prop">
            <template #default="{ row }">
                <!-- 数据行显示内容 -->
                <span v-if="row.type === 'data'">{{ row[col.prop] }}</span>
                <!-- 备注行显示备注 -->
                <span v-if="row.type === 'remark'">
                    {{ row.remark }}
                </span>
            </template>
        </el-table-column>
    </el-table>
</template>

<script>
export default {
    data() {
        return {
            // 原始数据
            originalData: [
                {
                    id: 1,
                    img: "xxxxx.jpg",
                    name: "张三",
                    age: 30,
                    address: "北京",
                    remark: "这是张三的备注"
                },
                {
                    id: 2,
                    img: "xxxx.jpg",
                    name: "李四",
                    age: 25,
                    address: "上海",
                    remark: "这是李四的备注"
                }
            ],
            processedData: [],
            columns: [
                { label: "姓名", prop: "name" },
                { label: "年龄", prop: "age" },
                { label: "地址", prop: "address" }
            ]
        };
    },
    created() {
        this.processData();
    },
    methods: {
        // 处理数据:插入备注行
        processData() {
            this.processedData = [];
            this.originalData.forEach(item => {
                // 插入数据行
                this.processedData.push({
                    ...item,
                    type: "data"
                });
                // 插入备注行
                this.processedData.push({
                    ...item,
                    type: "remark"
                });
            });
        },

        // 合并单元格逻辑
        handleSpan({ row, column, rowIndex, columnIndex }) {
            if (row.type === 'data') {
                if (columnIndex === 0 || columnIndex === 1) {
                    return { rowspan: 2, colspan: 1 };
                }
            } else if (row.type === 'remark') {
                if (columnIndex === 2) {
                    return {
                        rowspan: 1,
                        colspan: this.columns.length
                    };
                } else {
                    return [0, 0]
                }
            }
        },
        /** 多选框选中数据 */
        handleSelectionChange(selection) {
            console.log("选中数据", selection)
        }
    }
};
</script>
效果图
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容