1.这个是页面table
<el-table :span-method="objectSpanMethod"> </el-table>
2. elementUi 的span-method 方法
注意:我使用的是vue3 ,vue2 可以把state改为this,将spanArr,spanArr1放在data里
const objectSpanMethod = ({ rowIndex,columnIndex })=>{
if (columnIndex === 0) { //columnIndex 第几列
if (state.spanArr[rowIndex]) {
return {
rowspan: state.spanArr[rowIndex], //要合并的行数
colspan: 1 //要合并的行数
}
} else {
return {
rowspan: 0,
colspan: 0
}
}
}
if (columnIndex === 1) { //第二列
if (state.spanArr1[rowIndex]) {
return {
rowspan: state.spanArr1[rowIndex],
colspan: 1
}
} else {
return {
rowspan: 0,
colspan: 0
}
}
}
}
3.将后端的数据拿到后处理为数组,像这样把要要合并的数据排一起,某些字段相同,后端这样返回那就不用处理了
{id: 14, company_name: "男孩子", company_no: "11112", company_id: 67, name: "1", client_terminal_id: "1",…}
{id: 13, company_name: "女孩子", company_no: "45646", company_id: 65, name: "1", client_terminal_id: "2",…}
{id: 5, company_name: "奥利给", company_no: "3", company_id: 63, name: "23", client_terminal_id: "2",…}
{id: 4, company_name: "奥利给", company_no: "3", company_id: 63, name: "23", client_terminal_id: "3",…}
{id: 12, company_name: "测试奥利给", company_no: "1", company_id: 4, name: "32",…}
{id: 11, company_name: "测试奥利给", company_no: "2", company_id: 4, name: "3", client_terminal_id: "3",…}
{id: 10, company_name: "测试奥利给", company_no: "2", company_id: 4, name: "1", client_terminal_id: "2",…}
{id: 9, company_name: "测试奥利给", company_no: "2", company_id: 4, name: "13",…}
{id: 8, company_name: "测试奥利给", company_no: "2", company_id: 4, name: "1", client_terminal_id: "21",…}
{id: 7, company_name: "测试奥利给", company_no: "2", company_id: 4, name: "23", client_terminal_id: "4",…
4.tableDate为处理后的数组,
第一个方法返回的数组spanArr 处理表格第一列的合并
第二个方法返回的数组spanArr1 处理表格第二列的合并
item.company_name 中company_name 为你想要根据哪个字段要合并
注意:我使用的是vue3 ,vue2 可以把state改为this,将spanArr,spanArr1放在data里
const filterTableData = () => {
let contactDot = 0;
state.tableData.forEach((item, index) => {
if (index == 0) {
state.spanArr.push(1)
} else {
if (item.company_name === state.tableData[index - 1].company_name) {
state.spanArr[contactDot] += 1;
state.spanArr.push(0)
} else {
contactDot = index
state.spanArr.push(1)
}
}
})
}
const filterTableData1 = () => {
let contactDot = 0;
state.tableData.forEach((item, index) => {
if (index == 0) {
state.spanArr1.push(1)
} else {
if (item.name === state.tableData[index - 1].name && item.company_name === state.tableData[index - 1].company_name) {
state.spanArr1[contactDot] += 1;
state.spanArr1.push(0)
} else {
contactDot = index
state.spanArr1.push(1)
}
}
})
}
5..这个rest是调取后端接口返回数据 然后一定要清除spanArr ,和spanArr 1变量,也就是说每次
调用filterTableData,filterTableData1方法都要先清除 ,这样就可以了。合并更多列更多级道理都一样,然后把代码封装一下就可以了
const getTable = async ()=>{
let rest = await Api()
state.pageTotal = rest.total
state.tableData = rest.data
state.spanArr = []
state.spanArr1 = []
filterTableData()
filterTableData1()
}