el-table 合并相同值单元格

思路

先对table数据进行排序,让相同name的数据挨在一起,然后使用el-table的span-method进行合并

一、问题1

default-sort 默认排序失效

1. 原因

default-sort 生效时 数据还没有渲染进table

2. 尝试办法

  • nextTick()等待数据渲染结束,使用table的sort()方法手动排序,但是使用的vue3 setup,读取不到this
  • 给table绑定ref,但是也读不到

3. 解决办法

从接口接受数据后,直接用sort()给数据排序了

二、问题2

怎么进行数据合并

  1. 从接口获取到的数据,直接进行排序,使相同name的数据排在一起
//获取到数据,进行排序
 tableData.value.sort((a, b) => { return a.ecuDid - b.ecuDid })
  1. <template>中table传入span-method方法,绑定合并行或列的计算方法:ecuNumSpanMethod函数
<el-table v-else="page1 === 'upgradeVehicleParts'" id="reportParts" :data="tableData" border style="width: 100%" :span-method="ecuNumSpanMethod">
	<el-table-column label=" 数量" align="center">
		<el-table-column label="名称" prop="ecuName"></el-table-column>
		<el-table-column label="地址" prop="ecuDid"></el-table-column>
		<el-table-column label="编号" prop="ecuNum"></el-table-column>
		<el-table-column label="数量" prop="count"></el-table-column>
	</el-table-column>
</el-table>
  1. ecuNumSpanMethod 函数
const ecuNumSpanMethod = ({
    row,
    column,
    rowIndex,
    columnIndex,
}) => {
    if (columnIndex === 0 || columnIndex === 1) {     
        const currentValue = row[column.property];
        const preRow = tableData.value[rowIndex-1];
        //上一行这一列的数据
        const preValue = preRow ? preRow[column.property] : null;
        // 如果当前值和上一行的值相同,则将当前单元格隐藏
        if(currentValue === preValue){
            return{rowspan:0,colspan:0}
        }else{
            let rowspan = 1
            // 计算应该合并的行数
            for (let i = rowIndex + 1; i < tableData.value.length; i++){
                const nextRow = tableData.value[i]
                const nextValue = nextRow[column.property]
                if (nextValue === currentValue){
                    rowspan++
                }else{
                    break
                }
            }
            return { rowspan, colspan: 1 }
        }
    }
}

三、span-method工作原理

  1. 这个方法中会从上至下 ,从左至右遍历每一个单元格。在每一个单元格中执行span-method绑定的函数(ecuNumSpanMethod ),下图是遍历单元格下标(rowIndex,columnIndex)
  2. 函数返回值解析return {rowspan,colspan},表示当前单元格变成rowspan行,colspan列。rowspan默认向下合并,colspan默认向右合并。剩下的单元格视觉上会顺位移动,但是用index取值还是变化前。

四、代码思路

把第一行第二列合并成两行一列

if(columnIndex === 1 && rowIndex === 0){
      return {
        rowspan: 2,
        colspan: 1,
      }
    }

在这里插入图片描述把第二行第二列隐藏

if(columnIndex === 1 && rowIndex === 0){
      return {
        rowspan: 2,
        colspan: 1,
      }
    }
if(columnIndex === 1 && rowIndex === 1){
return {rowspan:0,colspan:0}
}

在这里插入图片描述
3. 所以想将相同name合并,只需要先将第一个玙剩下相同的合并,再把剩下的隐藏就可以

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用 `el-table-column` 的 `span-method` 属性来合并单元格。这个属性可以接收一个函数,用于决定哪些单元格需要合并。 你可以在 `el-table-column` 上添加 `span-method` 属性,并将其设置为一个函数。这个函数会接收三个参数:`{ row, column, rowIndex, columnIndex }`,分别表示当前行的数据,当前列的数据,当前行的索引和当前列的索引。你可以在函数中根据需要来判断是否需要合并单元格。 下面是一个示例代码: ```html <template> <el-table :data="tableData"> <el-table-column prop="name" label="姓名" :span-method="handleSpanMethod"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18, address: '北京' }, { name: '李四', age: 20, address: '上海' }, { name: '王五', age: 22, address: '广州' }, { name: '赵六', age: 18, address: '北京' } ] } }, methods: { handleSpanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0) { if (rowIndex === 0 || row.name !== this.tableData[rowIndex - 1].name) { let rowspan = 1 for (let i = rowIndex + 1; i < this.tableData.length; i++) { if (row.name === this.tableData[i].name) { rowspan++ } else { break } } return { rowspan, colspan: 1 } } else { return { rowspan: 0, colspan: 0 } } } } } } </script> ``` 在上面的代码中,我们通过使用 `span-method` 属性和 `handleSpanMethod` 方法来实现合并单元格。在 `handleSpanMethod` 方法中,我们判断当前列是否为第一列,并且判断当前行的姓名是否与上一行的姓名相同。如果满足条件,我们计算需要合并的行数(即 `rowspan`),并返回一个对象,其中包含合并的行数和列数。如果不满足条件,则返回 `{ rowspan: 0, colspan: 0 }` 来表示不需要合并。 这样就可以通过 `el-table-column` 的 `span-method` 属性来合并单元格了。希望对你有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值