废话不多说, 先上图片, 具体配置看我神操作
数据源
数据源就不给出来了, 反正 自己模拟一下, 把具有相同的项的内容改成一样的就行了
我是修改的前三项, 部分一样的
配置流程
1. 既然需要合并项, 肯定需要合并的条件, 官方给出了一个方法 :span-method , 所以第一步要做的 , 是在table的表格中添加 这个方法, 并且给一个回调函数
我的
objectSpanMethod 函数写在 methods 这个应该不用多说吗吧
<el-table
:data="tableData" :span-method="objectSpanMethod" // 这一行是重点 , 后面的回调函数决定了 合并的方向和合并的个数 border style="width: 100%; margin-top: 20px" :cell-style="{ textAlign: 'center' }" :header-cell-style="{ textAlign: 'center', background: '#f7f9fc' }" >
官方给的函数内容可以都删除了, 因为不符合我们的需求
2. 在确定右数据的地方调用配置函数 , 我因为数据暂时是静态的 , 所以 , 直接在 mounted 中调用即可 , 老铁们记得在获取完数据的ajax中调用这个函数, 不然会报错
mounted() { this.processingData(['id', 'name', 'amount1'], this.tableData) }
然后传递的参数 , 也解释一下
processingData 函数名字, 在methods 中定义, 下面会给出
第一个参数数组 , 里面有三个值, 是我要合并项的键名 , 或者说是你需要合并的 数据的 那一样代码 对应的 props 值 ;
值可以传递多个, 比如说 我 需要合并三列, 就传递了三个键名 , 具体传递几个 看你的业务需求
this.tableData为数据源
3. 在data中定义一个数组, 空数组, 为数据合并项容器
我定义的为
// 需要合并的数据 spanArr: []
4. 配置函数
这个函数有点绕, 老铁们看得懂的话, 应该也能写出来 , 看不懂就没必要看了, 反正不影响后面的内容, 直接复制粘贴过去也是以一样的
但是 最后一行的赋值 , 千万记得改成 你 定义了的 空数组, 因为我定义的就是spanArr , 所以我直接赋值了 , 其他的地方 不需要修改
processingData(arr, data) { // 返回的数据 const returnData = [] arr.forEach((j, k) => { fn(j, k, data) }) function fn(j, k, data) { // // 每次调用都在 需要合并的数组里面添加一个新数组 // returnData.push([]) // 记录上一次相同的索引 [2, 0, 2, 0, 1] let lastIndex = -1 data.forEach((item, i) => { if (i === 0) { // 处理第一项 lastIndex = i returnData.push([1]) } else { if (item[j] === data[i - 1][j]) { // 说明和上一个id是一样的 隐藏 returnData[k][lastIndex] = returnData[k][lastIndex] + 1 returnData[k].push(0) // 获取到合并的长度 } else { returnData[k].push(1) lastIndex = i } } }) } this.spanArr = returnData }
5. 需要配置的数据 搞定了, 下一步 就是 合并了
合并函数
// 合并行或者列 当前行 当前列 行号 列号 四个属性 objectSpanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0) { const arr1 = this.spanArr[0] if (arr1[rowIndex] === 0) { return [0, 0] } else { return [arr1[rowIndex], 1] } } if (columnIndex === 1) { const arr1 = this.spanArr[1] if (arr1[rowIndex] === 0) { return [0, 0] } else { return [arr1[rowIndex], 1] } } if (columnIndex === 2) { const arr1 = this.spanArr[2] if (arr1[rowIndex] === 0) { return [0, 0] } else { return [arr1[rowIndex], 1] } } },
一下子搞这么多, 说实话自己看着都有点懵逼 , 所以单独 拿一部分出来 解释一下 , 下面一定要看, 这个 是 实实在在影响最终布局的东西
this.processingData(['id', 'name', 'amount1'], this.tableData) <== 这是之前调用函数传递的参数
if (columnIndex === 0) { // 这一行代码是判断 当 列等于0的时候, 也就是 第一竖列 进行合并判断 const arr1 = this.spanArr[0] // 这里是spanArr[0] 是上面调用时候 'id'对应的数组, 多个判断 , 这个序号就是id在调用传入的数组的索引
// 下面的判断就不用变化了
if (arr1[rowIndex] === 0) { return [0, 0] } else { return [arr1[rowIndex], 1] } }