vue3 table动态合并,自定义参数合并单元格

复制代码
<template>
    <div>
        <el-table :data="tableData" :span-method="objectSpanMethod" border
            :header-cell-style="{ textAlign: 'center'}">
            <el-table-column prop="area" label="区域" align="center">
            </el-table-column>
            <el-table-column prop="province" label="省份" align="center" />
            <el-table-column prop="month_1" label="一月" align="center" />
            <el-table-column prop="month_2" label="二月" align="center" />
            <el-table-column prop="month_3" label="三月" align="center" />
        </el-table>
    </div>
</template>

<script lang="ts" setup>
import { ref, toRefs, reactive, nextTick, computed, watch, onMounted } from "vue";
const tableData = [
        // 一年级
        {
            area: "华北",
            province: "北京",
            month_1: "100",
            month_2: "张三",
            month_3: "90"
        },
        {
            area: "华北",
            province: "北京",
            month_1: "200",
            month_2: "张三",
            month_3: "90"
        },
        {
            area: "华北",
            province: "山西",
            month_1: "100",
            month_2: "张三",
            month_3: "90"
        },
        {
            area: "华北",
            province: "辽宁",
            month_1: "100",
            month_2: "张三",
            month_3: "90"
        },
        {
            area: "东北",
            province: "吉林",
            month_1: "100",
            month_2: "张三",
            month_3: "90"
        },
        {
            area: "东北",
            province: "黑2",
            month_1: "100",
            month_2: "张三",
            month_3: "90"
        },
        {
            area: "东北",
            province: "黑2",
            month_1: "100",
            month_2: "张三",
            month_3: "90"
        },
        {
            area: "东北",
            province: "黑2",
            month_1: "100",
            month_2: "张三",
            month_3: "90"
        },
        {
            area: "西北",
            province: "黑2",
            month_1: "100",
            month_2: "张三",
            month_3: "90"
        },
        {
            area: "西北",
            province: "西二",
            month_1: "100",
            month_2: "张三",
            month_3: "90"
        },
        {
            area: "西北",
            province: "西三",
            month_1: "100",
            month_2: "张三",
            month_3: "90"
        },
    ]
//存储合并单元格的开始位置
const setTabelRowSpan = (tableData:any, fieldArr:any, effectMerge = {}) => {
    let lastItem = {}
    fieldArr.forEach((field:any, index:any) => {
        let judgeArr = fieldArr.slice(0, index + 1)
        //@ts-ignore
        if (effectMerge[field]) {
            //@ts-ignore
            judgeArr = [...effectMerge[field], field]
            console.log(judgeArr, "--==judgeAr2222");

        }
        tableData.forEach((item:any) => {
            item.mergeCell = fieldArr
            const rowSpan = `rowspan_${field}`
            // 判断是否合并到上个单元格。
             //@ts-ignore
            if (judgeArr.every((e:any) => lastItem[e] === item[e] && item[e] !== '')) {
                // 判断是否所在行的列对应的值全部相同,并且此列的值不为空
                // 是:合并行
                item[rowSpan] = 0
                 //@ts-ignore
                lastItem[rowSpan] += 1
            } else {
                // 否:完成一次同类合并。lastItem重新赋值,进入下一次合并计算。
                item[rowSpan] = 1
                lastItem = item
            }
        })
    })
}
 //@ts-ignore
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
    if (row.mergeCell.includes(column.property)) {
        const rowspan = row[`rowspan_${column.property}`]
        if (rowspan) {
            return { rowspan: rowspan, colspan: 1 }
        } else {
            return { rowspan: 0, colspan: 0 }
        }
    }
}
onMounted(()=>{
    const effectMerge = {
        month_1: ['area'],//一月参照区域进行合并
        month_3: ['area']//三月参照区域合并
    }
    const arr = ['area', 'province', 'month_1', 'month_2', 'month_3']//全部字段
    setTabelRowSpan(tableData, arr, effectMerge)// (表格数据,表格字段,合并的条件)
})
</script>

<style></style>

效果图:

相关推荐
计算机毕设定制辅导-无忧学长5 小时前
《基于Spring Boot的迷游哈游戏综合服务平台的开发》
java·vue.js·spring boot·mysql·迷游哈游戏综合服务平台
恋猫de小郭6 小时前
Flutter 3.50 & Dart 3.14 发布,快来看看有什么更新吧
android·前端·flutter
非优秀程序员14 小时前
第10章 千团出世|《互联网产品恩仇录》
前端
非优秀程序员14 小时前
第11章 小高在对面|《互联网产品恩仇录》
前端
非优秀程序员14 小时前
第14章 只剩美团|《互联网产品恩仇录》
前端
非优秀程序员14 小时前
第09章 老乡何必为难老乡|《互联网产品恩仇录》
前端
非优秀程序员14 小时前
第07章 孙德良的阳谋|《互联网产品恩仇录》
javascript·后端
非优秀程序员14 小时前
第03章 三大门户,烽烟起于瀛海威|《互联网产品恩仇录》
前端
非优秀程序员14 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
程序员大阳18 小时前
HTML+CSS+JS对话式实战(5)-活动管理页之查看报名名单的实现
javascript·css·html·查看报名名单