Bootstrap

vue3 elemnetPlus table 数据id 相同的合并单元格

<template>
  <el-table :data="tableData" :span-method="arraySpanMethod" style="width: 100%">
    <el-table-column prop="id" label="ID" width="180"></el-table-column>
    <el-table-column prop="name" label="Name" width="180"></el-table-column>
    <!-- 其他列 -->
  </el-table>
</template>
 
<script>
import { ref } from 'vue';
 
export default {
  setup() {
    const tableData = ref([
      { id: 1, name: 'Alice' },
      { id: 1, name: 'Bob' },
      { id: 2, name: 'Charlie' },
      { id: 2, name: 'David' }
    ]);

 
    const idMap = new Map(); // 用于存储每个id连续出现的次数和起始行索引


    tableData.value.forEach((row, index) => {
      if (!idMap.has(row.id)) {
        idMap.set(row.id, { count: 1, startIndex: index });
      } else {
        const { count, startIndex } = idMap.get(row.id);
        idMap.set(row.id, { count: count + 1, startIndex });
      }
    });
 
    const arraySpanMethod = ({ row, column, rowIndex }) => {
      if (column.property === 'id') {
        const { count, startIndex } = idMap.get(row.id);
        if (rowIndex === startIndex) {
          return [count, 1]; // 在起始行,跨越count行,1列
        } else {
          return [0, 0]; // 其他行,不显示(被合并了)
        }
      } else {
        return [1, 1]; // 其他列,正常显示
      }
    };
 
    return {
      tableData,
      arraySpanMethod,
    };
  },
};
</script>

/*

//动态添加行或列 需要 在监听处清空map  idMap.clear();

watchEffect(() => {

  idMap.clear();

  tableData.value = final.value.list;

  tableData.value.forEach((row, index) => {

    let id = getpropertyId(row)

    if (!idMap.has(id)) {

      idMap.set(id, { count: 1, startIndex: index });

    } else {

      const { count, startIndex } = idMap.get(id);

      idMap.set(id, { count: count + 1, startIndex });

    }

  });

})

*/

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;