elementPlus表格动态合并单元格方法

1.要实现如下效果,如图,但是后端返回的数据是不确定的,需要自己根据id 去分组

2.假如这是后端返回的数据结构,title相同的则应该合并为一组

[
    { info: '信息1', operation: '操作1', isMust: false, association: false, title: '基础信息' },
    { info: '信息2', operation: '操作2', isMust: false, association: false, title: '基础信息' },
    { info: '出生信息1', operation: '操作1', isMust: false, association: false, title: '出生信息' },
    { info: '出生信息2', operation: '操作2', isMust: false, association: false, title: '出生信息' },
  ]

3.使用element的合并单元格的方法:span-method="objectSpanMethod",新建use-span-method.js文件,内容如下

/**
 * 合并相同数据,导出合并列所需的方法(只适合el-table)
 * @param {Object} data
 * @param {Object} rowSpanArray
 */
export function getRowSpanMethod(data, rowSpanArray) {

	/**
	 * 要合并列的数据
	 */
	const rowSpanNumObject = {};

	//初始化 rowSpanNumObject
	rowSpanArray.map(item => {
		rowSpanNumObject[item] = new Array(data.length).fill(1, 0, 1).fill(0, 1);
		rowSpanNumObject[`${item}-index`] = 0;
	});
	//计算相关的合并信息
	for (let i = 1; i < data.length; i++) {
		rowSpanArray.map(key => {
			const index = rowSpanNumObject[`${key}-index`];
			if (data[i][key] === data[i - 1][key]) {
				rowSpanNumObject[key][index]++;
			} else {
				rowSpanNumObject[`${key}-index`] = i;
				rowSpanNumObject[key][i] = 1;
			}

		});
	}

	//提供合并的方法并导出
	const spanMethod = function({ row, column, rowIndex, columnIndex }) {
		if (rowSpanArray.includes(column['property'])) {
			const rowspan = rowSpanNumObject[column['property']][rowIndex];
			if (rowspan > 0) {
				return { rowspan: rowspan, colspan: 1 }
			}
			return { rowspan: 0, colspan: 0 }
		}
		return { rowspan: 1, colspan: 1 }
	};

	return spanMethod;
}

4.引入并使用

//html部分
<el-table
                :data="tableData"
                :span-method="objectSpanMethod"
                border
                style="width: 100%; margin-top: 20px;"
                >
                <el-table-column prop="title" label="类别" width="180" />
                <el-table-column prop="info" label="信息" />
                <el-table-column  label="选择" width="80">
                    <template #header>
                        <el-checkbox @change="selAllmarkInfoChange" v-model="selAllmarkInfo" label="选择" size="large" />
                    </template>
                    <template #default="scope" >
                        <div style="text-align: center;">
                            <el-checkbox @change="checkedStatusChange" v-model="scope.row.checkedStatus"  size="large" />
                        </div>
                    </template>
                </el-table-column>
            </el-table>
//js部分
import { getRowSpanMethod } from './use-span-method.js'
const objectSpanMethod = computed(() => {
    return getRowSpanMethod(tableData, ['title', 'info'])
}) 

要在element-ui的表格组件中合并单元格,可以利用`span-method`属性来自定义合并规则。下面是一个示例代码,展示如何合并表格中相同的值: ```html <template> <el-table :data="tableData" :span-method="mergeCells"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column prop="gender" label="性别"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 20, gender: '男' }, { name: '李四', age: 22, gender: '女' }, { name: '王五', age: 20, gender: '男' }, { name: '赵六', age: 22, gender: '女' } ] }; }, methods: { mergeCells({ row, column, rowIndex, columnIndex }) { if (columnIndex === 1) { // 合并年龄列 if (rowIndex === 0 || (rowIndex > 0 && row.age !== this.tableData[rowIndex - 1].age)) { const rowspan = this.getRowspan(row.age, columnIndex); if (rowspan > 1) { return { rowspan, colspan: 1 // 只合并一列 }; } } } }, getRowspan(value, columnIndex) { let rowspan = 1; for (let i = this.tableData.length - 1; i > 0; i--) { if (this.tableData[i].age === value && i !== columnIndex) { rowspan++; } else { break; } } return rowspan; } } }; </script> ``` 上述代码中,我们定义了一个名为`mergeCells`的方法来确定单元格是否需要合并。在`span-method`中绑定该方法后,根据特定的条件返回合并的行数和列数。 以上代码仅合并了年龄(第二列)相同的单元格,您可以根据需要进行修改和扩展。请确保在实际使用时,将表格数据和合并规则适配到您的具体情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值