当前位置:   article > 正文

vue3 element-plus el-table:列表中相同名称的数据实现行合并_element-ui el-table span-method合并name相同的行

element-ui el-table span-method合并name相同的行

效果:

html:

使用el-tablespan-method属性控制合并行

  1. <el-table :data="tableData" :span-method="objectSpanMethod" stripe border v-loading="tableLoading">
  2. <el-table-column prop="oppositeName" label="客户" show-overflow-tooltip>
  3. <template #default="{ row }">
  4. <div :class="row.dataType == '2' || row.dataType == '3' ? 'name-total-cell' : ''">{{
  5. row.oppositeName
  6. }}</div>
  7. </template>
  8. </el-table-column>
  9. <el-table-column prop="goodsName" label="煤种" show-overflow-tooltip></el-table-column>
  10. <el-table-column prop="goodsPrice" label="单价(元)" show-overflow-tooltip></el-table-column>
  11. <el-table-column prop="trucSum" label="车数(辆)" show-overflow-tooltip></el-table-column>
  12. <el-table-column prop="tonSum" label="拉运吨数(吨)" show-overflow-tooltip></el-table-column>
  13. </el-table>

js:

handleTableData: 处理表格数据,将同一名称的数据进行组合
objectSpanMethod合并单元格

  1. // data
  2. // 分页数据
  3. const pageData = ref({
  4. total: 0,
  5. page: 1,
  6. pageSize: 10,
  7. });
  8. let tableLoading = ref(false);
  9. let tableData = ref([]);
  10. let rowSpanArr = ref([]);
  11. interface SpanMethodProps {
  12. row: any;
  13. column: any;
  14. rowIndex: number;
  15. columnIndex: number;
  16. }
  17. // onMounted
  18. onMounted(() => {
  19. getTableData();
  20. });
  21. // methods
  22. // 获取表格数据
  23. const getTableData = (page?: number) => {
  24. tableLoading.value = true;
  25. if (page) {
  26. pageData.value.page = page;
  27. }
  28. let params = {...pageData.value};
  29. http
  30. .post('/smart-order-service/orderDispatchStatistics/orderDispatchStatistics', params)
  31. .then((res) => {
  32. if (res && res.data) {
  33. tableData.value = res.data || [];
  34. handleTableData(tableData.value);
  35. if (pageData.value.page === 1) pageData.value.total = res.data.total || 0;
  36. } else {
  37. tableData.value = [];
  38. pageData.value.total = 0;
  39. }
  40. })
  41. .finally(() => {
  42. tableLoading.value = false;
  43. });
  44. };
  45. // 获取相同名称的个数 tableData: 表格的数据, oppositeName: 确定相同的参数
  46. const handleTableData = (tableData: any) => {
  47. let rowSpanList = <any>[],
  48. position = 0;
  49. for (let [index, item] of tableData.entries()) {
  50. if (index == 0) {
  51. rowSpanList.push(1);
  52. position = 0;
  53. } else {
  54. if (item['oppositeName']) {
  55. if (item['oppositeName'] == tableData[index - 1]['oppositeName']) {
  56. rowSpanList[position] += 1; //项目名称相同,合并到同一个数组中
  57. rowSpanList.push(0);
  58. } else {
  59. rowSpanList.push(1);
  60. position = index;
  61. }
  62. } else {
  63. rowSpanList.push(1);
  64. position = index;
  65. }
  66. }
  67. }
  68. rowSpanArr.value = rowSpanList;
  69. };
  70. // 单元格的处理方法 当前行row、当前列column、当前行号rowIndex、当前列号columnIndex
  71. const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => {
  72. if (columnIndex === 0) {
  73. // 普通数据
  74. if (row.dataType == 1) {
  75. const rowSpan = rowSpanArr.value[rowIndex];
  76. return [rowSpan, 1];
  77. } else {
  78. // 小计
  79. if (row.dataType == 2) {
  80. row.oppositeName = '小计';
  81. return [1, 3];
  82. }
  83. // 总计
  84. if (row.dataType == 3) {
  85. row.oppositeName = '总计';
  86. return [1, 3];
  87. }
  88. }
  89. }
  90. if (columnIndex === 1 || columnIndex === 2) {
  91. if (row.dataType == 2 || row.dataType == 3) {
  92. return [0, 0];
  93. }
  94. }
  95. };

其它:

objectSpanMethod原理:对每一个单元格返回一个[rowSpan, colSpan]数组, rowSpan表示当前单元格会展示的行数,colSpan表示当前单元格会展示的列数,设置为0时当前单元格被消除。

参考文章:
element-ui table :span-method(行合并)
js将数组中的相同项放在毗邻位置

el-table:列表中相同名称的数据实现行合并 - 简书

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/101063?site
推荐阅读
相关标签
  

闽ICP备14008679号