vue + Element UI table动态合并单元格

一、功能需求

1、根据名称相同的合并工作阶段和主要任务合并这两列,但主要任务内容一样,但要考虑主要任务一样,但工作阶段不一样的情况。(枞向合并)

2、落实情况里的定量内容和定性内容值一样则合并。(横向合并)

二、功能实现

<template>

<div class="effect">

<el-table :data="tableData" border style="width: 100%" :span-method="objectSpanMethod">

<el-table-column type="index" label="序号" align="center" width="180">

</el-table-column>

<el-table-column prop="name" label="工作阶段" align="center" min-width="180">

</el-table-column>

<el-table-column prop="address" label="主要任务" align="center" min-width="180">

</el-table-column>

</el-table>

</div>

</template>

<script>

export default {

data () {

return {

tableData: [

{

name: 'a',

address: '1',

age:'1',

six:'2'

},

{

name: 'a',

address: '1',

age:'1',

six:'2'

},

{

name: 'a',

address: '1',

age:'1',

six:'2'

},

{

name: 'a',

address: '1',

age:'1',

six:'2'

},

{

name: 'a',

address: '2',

age:'1',

six:'2'

},

{

name: 'a',

address: '2',

age:'1',

six:'1'

},

{

name: 'a',

address: '3',

age:'1',

six:'1'

},

{

name: 'a',

address: '3',

age:'1',

six:'1'

},

{

name: 'b',

address: '3',

age:'1',

six:'1'

},

{

name: 'b',

address: '3',

age:'1',

six:'1'

},

{

name: 'b',

address: '3',

age:'1',

six:'1'

},

{

name: 'b',

address: '4',

age:'1',

six:'1'

},

{

name: 'b',

address: '4',

age:'1',

six:'1'

},

{

name: 'b',

address: '5',

age:'2',

six:'1'

},

{

name: 'b',

address: '5',

age:'',

six:''

},

]

}

},

mounted () {

// 处理第二列的合并

for (let i = 0; i < this.tableData.length; i++) {

//第一个单元格合并列为1

this.tableData[i].nameSpan = 1

//和后面值的比较,

for (let j = i+1; j < this.tableData.length; j++) {

//如果值一样,则合并列为+1

if(this.tableData[i].name != this.tableData[j].name){

//如果遇到值不一样,则将 i = k -1 因为 下次循环i会+1

i = j-1

// 结束循环

break;

}else{

this.tableData[i].nameSpan += 1

// 最后一行了,将k的值赋给i,结束循环

if(j == this.tableData.length-1){

i = j

// 结束循环

break;

}

}

}

}

// 处理第三列的合并

for (let i = 0; i < this.tableData.length; i++) {

//第一个单元格合并列为1

this.tableData[i].addressSpan = 1

//和后面值的比较,

for (let k = i+1; k < this.tableData.length; k++) {

//如果值一样,则合并列为+1

if(this.tableData[i].address == this.tableData[k].address && this.tableData[i].name == this.tableData[k].name){

this.tableData[i].addressSpan += 1

// 最后一行了,将k的值赋给i,结束循环

if(k == this.tableData.length-1){

i = k

// 结束循环

break;

}

}else{

//如果遇到值不一样,则将 i = k -1 因为 下次循环i会+1

i = k-1

// 结束循环

break;

}

}

}

// 处理第四列和第五列横向合并

for (let i = 0; i < this.tableData.length; i++) {

this.tableData[i].ageColspan = 1

if(this.tableData[i].age && this.tableData[i].six && this.tableData[i].age == this.tableData[i].six){

this.tableData[i].ageColspan += 1

}

}

console.log(this.tableData);

},

methods: {

//合并方法

objectSpanMethod ({ row, column, rowIndex, columnIndex }) {

if (columnIndex === 1) {

return {rowspan:row.nameSpan,colspan: 1}

}

if (columnIndex === 2) {

return {rowspan:row.addressSpan,colspan: 1}

}

if (columnIndex === 3) {

return {rowspan:1,colspan: row.ageColspan}

}

}

},

}

</script>

<style lang="scss" scoped>

.effect {

width: 100%;

height: calc(100vh - 90px);

padding: 5px;

}

</style>

相关推荐
wuhen_n18 分钟前
网络请求在Vite层的代理与Mock:告别跨域和后端依赖
前端·javascript·vue.js
小彭努力中18 分钟前
193.Vue3 + OpenLayers 实战:圆孔相机模型推算卫星拍摄区域
vue.js·数码相机·vue·openlayers·geojson
用户69371750013845 小时前
Google 正在“收紧侧加载”:陌生 APK 安装或需等待 24 小时
android·前端
蓝帆傲亦5 小时前
Web 前端搜索文字高亮实现方法汇总
前端
用户69371750013845 小时前
Room 3.0:这次不是升级,是重来
android·前端·google
漫随流水7 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
踩着两条虫8 小时前
VTJ.PRO 核心架构全公开!从设计稿到代码,揭秘AI智能体如何“听懂人话”
前端·vue.js·ai编程
jzlhll1239 小时前
kotlin Flow first() last()总结
开发语言·前端·kotlin
用头发抵命9 小时前
Vue 3 中优雅地集成 Video.js 播放器:从组件封装到功能定制
开发语言·javascript·ecmascript
蓝冰凌10 小时前
Vue 3 中 defineExpose 的行为【defineExpose暴露ref变量】详解:自动解包、响应性与实际使用
前端·javascript·vue.js