当前位置:   article > 正文

vue3 结合element-plus组件库使用table进行合并行_vue3 el-table 增加合计行及合并行

vue3 el-table 增加合计行及合并行

需求 比如:

image.png

个人查看element-plus文档,去结合使用 [链接](Table 表格 | Element Plus (element-plus.org))

element文档中有“合并行或列”的例子: 多行或多列共用一个数据时,可以合并行或列。

通过给 table 传入span-method方法可以实现合并行或列, 方法的参数是一个对象,里面包含当前行 row、当前列 column、当前行号 rowIndex、当前列号 columnIndex 四个属性。 该函数可以返回一个包含两个元素的数组,第一个元素代表 rowspan,第二个元素代表 colspan。 也可以返回一个键名为 rowspan 和 colspan 的对象;

话不多说,上代码!

  1. import type { TableColumnCtx } from 'element-plus';
  2. //举例数据格式
  3. const data = [
  4. {
  5. userName: "营业收费系统",
  6. value1: "中国农业银行",
  7. value2: "2022-03",
  8. detectionTime: "2022-03-04",
  9. },
  10. {
  11. userName: "营业收费系统",
  12. value1: "中国农业银行",
  13. value2: "2022-03",
  14. detectionTime: "2022-03-04",
  15. },
  16. {
  17. userName: "营业收费系统",
  18. value1: "中国农业银行",
  19. value2: "2022-03",
  20. detectionTime: "2022-03-04",
  21. },
  22. {
  23. userName: "营业收费系统",
  24. value1: "中国农业银行",
  25. value2: "2022-03",
  26. detectionTime: "2022-03-04",
  27. }
  28. ];
  29. //需要判断的属性组
  30. const spanProps = ['userName', 'detectionTime'];
  31. let rowSpansMap = new Map(); //存需要开始合并的行号,向下合并多少行
  32. /**
  33. * 根据列表数据得出需要合并的行
  34. * @param data 列表数据
  35. */
  36. const spanPropGroup = (data: any) => {
  37. let oldRow: any = null; //需要合并的行
  38. rowSpansMap = new Map(); //重置Map
  39. oldRow = data[0]; //默认第0行为需要合并的行
  40. rowSpansMap.set(0, 1); //第0行,向下合并一行(其实就是自己单独一行)
  41. let spanRow = 0; //记录需要开始合并的行号
  42. for (let i = 1; i < data.length; i++) {
  43. const item = data[i];
  44. let isSame = true;
  45. //遍历需要判断的属性判断对应值是否全部相等
  46. for (let j = 0; j < spanProps.length; j++) {
  47. const prop = spanProps[j];
  48. //只要有一个属性值不相等则记录新的需要合并的行号
  49. if (item[prop] != oldRow[prop]) {
  50. oldRow = item;
  51. rowSpansMap.set(i, 1);
  52. spanRow = i;
  53. isSame = false;
  54. break;
  55. }
  56. }
  57. //如果所有属性值相同则所需要合并的行数+1
  58. if (isSame) {
  59. let span = rowSpansMap.get(spanRow);
  60. rowSpansMap.set(spanRow, span + 1);
  61. }
  62. }
  63. };
  64. const objectSpanMethod: any = ({ row, column, rowIndex, columnIndex }) => {
  65. //采样值1-5列所对应的行不需要合并
  66. if (columnIndex != 3 && columnIndex != 4) {
  67. //根据当前行号从map中获取开始合并的行根据当前行号从map中获取开始合并的行号,向下合并多少行
  68. const span = rowSpansMap.get(rowIndex);
  69. if (span != null) {
  70. return {
  71. rowspan: span, //向下合并span行
  72. colspan: 1,
  73. };
  74. } else {
  75. return {
  76. rowspan: 0,
  77. colspan: 0,
  78. };
  79. }
  80. }
  81. };
  82. //进行传递数据
  83. spanPropGroup(data);
  1. <template>
  2. <el-table
  3. :data="data"
  4. border
  5. :span-method="objectSpanMethod"
  6. >
  7. <el-table-column type="selection" width="55" />
  8. <el-table-column label="#" width="60" prop="">
  9. <template #default="{ $index }">
  10. {{ $index + 1 }}
  11. </template>
  12. </el-table-column>
  13. <el-table-column
  14. label="指标组合名称"
  15. align="center"
  16. prop="userName"
  17. show-overflow-tooltip
  18. />
  19. <el-table-column
  20. label="已使用使用指标"
  21. align="center"
  22. prop="value1"
  23. show-overflow-tooltip
  24. />
  25. <el-table-column
  26. label="权重"
  27. align="center"
  28. prop="value2"
  29. show-overflow-tooltip
  30. />
  31. <el-table-column
  32. label="计算状态"
  33. align="center"
  34. prop="detectionTime"
  35. show-overflow-tooltip
  36. />
  37. <el-table-column label="操作" width="160" resizable>
  38. <template #default="scope">
  39. <el-buttontype="text">删除</el-button>
  40. </template>
  41. </el-table-column>
  42. </el-table>
  43. </template>

这样的效果就达到想要的需求了,细心观察一下代码!

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

闽ICP备14008679号