在Vue框架下实现表格行合并的两种方法

 更新时间:2026年04月03日 09:07:12   作者:邹荣乐  
本文介绍了ElementUI和Antd+Vue中el-table和a-table实现行合并的方法,包括基本使用、实现步骤、示例代码等,通过自定义计算合并行数的方法,可以灵活实现表格数据的合并显示,提升数据的可读性和用户体验,需要的朋友可以参考下

一、el-table 行合并

在前端开发中,数据展示一直是一个重要的部分,而表格则是数据展示最常见的形式之一。ElementUI 是饿了么前端团队推出的一款基于 Vue 的 UI 组件库,其中的 el-table 组件是一个功能强大且灵活的表格组件。今天我们要详细探讨的是 el-table 的行列合并操作。

1、初识 el-table

el-table 是一个提供了丰富功能和极高定制性的表格组件。它不仅能展示常规的表格数据,还可以实现复杂的数据处理和展示需求,如排序、过滤、分页、合并单元格等。而在实际开发中,行列合并是一个非常实用的功能,尤其是在展示报表数据时,能够极大地提升数据的可读性和用户体验。

2、el-table 的基本使用

在开始讨论行列合并之前,我们先简单了解一下 el-table 的基本使用方法。我们可以通过 el-table 标签和 el-table-column 标签来定义一个表格。el-table 用于定义整个表格,而 el-table-column 用于定义表格中的每一列。

3、行合并的实现

行合并是指将相同数据的相邻行合并成一个单元格,这在数据表格中非常常见。ElementUI 通过 span-method 属性来实现行合并功能。span-method 是一个方法,用于设置单元格的 rowspan 和 colspan。该方法的返回值是一个包含 rowspan 和 colspan 的对象,通过它们可以控制单元格的合并。

4、实现步骤

  1. 定义表格数据:获取你的表格数据,这些数据将用于渲染表格。
  2. 对数据进行排序:如果接口返回数据已经做了排序处理,这布可以忽略。
  3. 计算合并行数:编写一个方法来计算每一行需要合并的行数。这个方法会遍历表格数据,根据需要合并的列的值来判断哪些行需要合并。
  4. 设置span-method:在el-table组件中设置span-method属性,并传入你编写的计算合并行数的方法。

5、示例代码

<template>
    <div class="about">
        <h2 style="margin-top: 10px;">element-plus 合并行示例</h2>
        <div style="margin-bottom: 10px;">
            在Vue中使用Element UI的el-table组件时,可以通过span-method属性来合并表格中的单元格。
        </div>
        <el-table :data="tableData" :span-method="objectSpanMethod" border style="width: 100%">
            <el-table-column prop="name" label="Name" />
            <el-table-column prop="age" label="Age"  />
            <el-table-column prop="address" label="Address" />
        </el-table>
    </div>
</template>
<script setup>
import { ref, onMounted, reactive } from 'vue'
const spanArr = ref([])
const tableData = ref([
    { key: '1', name: 'Mike', age: 30, address: 'Chicago' },
    { key: '2', name: 'Alice', age: 22, address: 'Phoenix' },
    { key: '3', name: 'John', age: 25, address: 'New York' },
    { key: '4', name: 'Mike', age: 31, address: 'Houston' },
    { key: '5', name: 'John', age: 26, address: 'Los Angeles' },
    { key: '6', name: 'jack', age: 22, address: 'aPhoenix' },
])
// 排序方法
const sortData = () => {
    tableData.value.sort((a, b) => a.name.localeCompare(b.name))
    // 计算合并行数
    calculateSpanArr()
}
// 计算合并行数
const calculateSpanArr = () => {
    const tempArr = []
    let position = 0
    // 这里以姓名重复的数据进行合并,实际应用中可以根据需求调整合并规则
    tableData.value.forEach((item, index) => {
        if (index === 0) {
            tempArr.push(1)
            position = 0
        } else {
            if (item.name === tableData.value[index - 1].name) {
                tempArr[position] += 1
                tempArr.push(0)
            } else {
                tempArr.push(1)
                position = index
            }
        }
    })
    spanArr.value = tempArr
}
// 合并单元格方法
const objectSpanMethod = ({ columnIndex, rowIndex }) => {
    if (columnIndex === 0) {
        return {
            rowspan: spanArr.value[rowIndex],
            colspan: spanArr.value[rowIndex] > 0 ? 1 : 0
        }
    }
    return { rowspan: 1, colspan: 1 }
}
onMounted(() => {
    sortData() // 初始加载时自动排序
})
</script>

6、解释

  • 表格数据:tableData数组包含了需要展示的表格数据。
  • 计算合并行数:calculateSpanArr方法遍历tableData,根据name字段的值来计算每一行需要合并的行数,并将结果存储在spanArr数组中。
  • span-method:objectSpanMethod方法根据columnIndex来判断是否需要合并单元格。如果columnIndex为0(即第一列),则返回spanArr数组中对应的值;否则,返回[1, 1]表示正常显示单元格。
  • 组件挂载:在mounted生命周期钩子中调用calculateSpanArr方法来初始化spanArr数组。
  • 这样,当表格数据中的第一列有相同值时,这些值所在的单元格就会被合并。

7、运行效果

二、a-table 行合并

antd+vue是我目前项目的主流,在工作过程中,经常用到table组件。比如:当有大量结构化的数据需要展现时;当需要对数据进行排序、搜索、分页、自定义操作等复杂行为时。

1、初识 a-table

A-Table 是 Ant Design 提供的一个功能强大的表格组件,用于展示结构化数据并支持分页、排序、筛选等功能。

2、a-table 的基本使用

A-Table 支持多种属性来定制表格的行为和外观。常见的属性包括 columns(列定义)、dataSource(数据源)、pagination(分页设置)等。

3、行合并的实现

使用customCell和customRender实现首列相同数据合并。

4、实现步骤

  1. 定义表格数据:获取你的表格数据,这些数据将用于渲染表格。
  2. 对数据进行排序:如果接口返回数据已经做了排序处理,这布可以忽略。
  3. 计算合并行数:编写一个方法来计算每一行需要合并的行数。这个方法会遍历表格数据,根据需要合并的列的值来判断哪些行需要合并。
  4. 设置span-method:在el-table组件中设置span-method属性,并传入你编写的计算合并行数的方法。

5、示例代码

<template>
    <div class="about">
        <h2 style="margin-top: 10px;">ant-design-vue 合并行示例</h2>
        <div style="margin-bottom: 10px;">
            以下是基于Ant Design Vue的表格合并实现,使用customCell和customRender实现首列相同数据合并:
        </div>
        <a-table :dataSource="tableData" :columns="columns" bordered  />
    </div>
</template>
<script setup>
import { ref, onMounted, reactive } from 'vue'

const tableData = ref([
    { key: '1', name: 'Mike', age: 30, address: 'Chicago' },
    { key: '2', name: 'Alice', age: 22, address: 'Phoenix' },
    { key: '3', name: 'John', age: 25, address: 'New York' },
    { key: '4', name: 'Mike', age: 31, address: 'Houston' },
    { key: '5', name: 'John', age: 26, address: 'Los Angeles' },
    { key: '6', name: 'jack', age: 22, address: 'aPhoenix' },
])

// 转换为 element-plus 合并行格式
const spanMap = ref({})

// 计算合并规则
const calculateSpans = () => {
    const tempMap = {}
    let position = 0
    // 这里以姓名重复的数据进行合并,实际应用中可以根据需求调整合并规则
    tableData.value.forEach((item, index) => {
        if (index === 0) {
            tempMap[index] = { span: 1 }
            position = 0
        } else {
            if (item.name === tableData.value[index - 1].name) {
                tempMap[position].span += 1
                tempMap[index] = { span: 0 }
            } else {
                tempMap[index] = { span: 1 }
                position = index
            }
        }
    })
    spanMap.value = tempMap
}

// 排序方法
const sortData = () => {
    tableData.value.sort((a, b) => a.name.localeCompare(b.name))
    // 重新计算合并规则
    calculateSpans()
}

// 列定义
const columns = [
    {
        title: 'Name',
        dataIndex: 'name',
        customCell: (_, index) => {
            return {
                rowSpan: spanMap.value[index]?.span || 0
            }
        }
    },
    {
        title: 'Age',
        dataIndex: 'age'
    },
    {
        title: 'Address',
        dataIndex: 'address'
    }
]

onMounted(() => {
    sortData() // 初始加载时自动排序
})
</script>

6、解释

  • 合并机制:Ant Design使用customCell返回rowSpan实现合并,不同于Element Plus的span-method
  • 数据结构:必须包含key字段作为唯一标识
  • API:列定义通过columns数组配置,合并逻辑写在customCell中
  • 零值处理:被合并的行需要返回rowSpan: 0

7、运行效果

以上就是在Vue框架下实现表格行合并的两种方法的详细内容,更多关于Vue表格行合并的资料请关注脚本之家其它相关文章!

相关文章

  • Vue3+JS高级前端面试题及答案总结大全

    Vue3+JS高级前端面试题及答案总结大全

    这篇文章主要介绍了Vue3+JS高级前端面试题及答案总结的相关资料,在实际项目中,能运用这些技能高效开发前端页面,优化用户体验,对Vue的生态系统也有一定了解,需要的朋友可以参考下
    2025-12-12
  • vue自定义js图片碎片轮播图切换效果的实现代码

    vue自定义js图片碎片轮播图切换效果的实现代码

    这篇文章主要介绍了vue自定义js图片碎片轮播图切换效果的实现代码,需要的朋友可以参考下
    2019-04-04
  • Vue项目打包并部署nginx服务器的详细步骤

    Vue项目打包并部署nginx服务器的详细步骤

    vue项目开发好之后需要部署到服务器上进行外网访问,下面这篇文章主要给大家介绍了关于Vue项目打包并部署nginx服务器的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • vue文本识别"\n"换行问题的解决方式

    vue文本识别"\n"换行问题的解决方式

    在页面中经常会遇到自定义文本,如果文本过长就需要换行,在HTML中可以通过标签换行,也可以通过\n转椅字符换行,下面这篇文章主要给大家介绍了关于vue文本识别“\n”换行问题的解决方式,需要的朋友可以参考下
    2022-11-11
  • vue自定义表单生成器form-create使用详解

    vue自定义表单生成器form-create使用详解

    这篇文章主要介绍了vue自定义表单生成器,可根据json参数动态生成表单,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • vue3的ref、isRef、toRef、toRefs、toRaw详细介绍

    vue3的ref、isRef、toRef、toRefs、toRaw详细介绍

    本文详细讲解了vue3的ref、isRef、toRef、toRefs、toRaw,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • mpvue中配置vuex并持久化到本地Storage图文教程解析

    mpvue中配置vuex并持久化到本地Storage图文教程解析

    这篇文章主要介绍了mpvue中配置vuex并持久化到本地Storage的教程详解,# 配置vuex和在vue中相同,只是mpvue有一个坑,就是不能直接在new Vue的时候传入store。本文分步骤给大家介绍的非常详细,需要的朋友参考下吧
    2018-03-03
  • 解决VMware中vmware-vmx.exe进程无法关闭以及死机等问题

    解决VMware中vmware-vmx.exe进程无法关闭以及死机等问题

    这篇文章主要介绍了解决VMware中vmware-vmx.exe进程无法关闭以及死机等问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Vue3使用icon的两种方式实例

    Vue3使用icon的两种方式实例

    vue开发网站的时候,往往图标是起着很重要的作用,下面这篇文章主要给大家介绍了关于Vue3使用icon的两种方式,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-11-11
  • vue如何实现角色权限的控制

    vue如何实现角色权限的控制

    关于角色与权限控制,通常是分为两大类,一种是菜单权限,一种是操作权限,本文将深入探讨如何通过 Vue 实现角色权限控制,特别是基于按钮级别的权限控制,需要的可以了解下
    2025-02-02

最新评论