正文

1. 源码

  1. <template>
  2. <div>
  3. <!-- 指定 count 取默认属性 -->
  4. <el-table
  5. :data="tableData"
  6. :span-method="arraySpanMethod"
  7. border
  8. style="width: 100%">
  9. <el-table-column
  10. prop="id"
  11. label="ID"
  12. width="180">
  13. </el-table-column>
  14. <el-table-column
  15. prop="name"
  16. label="姓名">
  17. </el-table-column>
  18. <el-table-column
  19. prop="amount1"
  20. sortable
  21. label="数值 1">
  22. </el-table-column>
  23. <el-table-column
  24. prop="amount2"
  25. sortable
  26. label="数值 2">
  27. </el-table-column>
  28. <el-table-column
  29. prop="amount3"
  30. sortable
  31. label="数值 3">
  32. </el-table-column>
  33. </el-table>
  34. <hr />
  35. <!-- 指定 props -->
  36. <el-table
  37. :data="tableData"
  38. :span-method="arraySpanMethod2"
  39. border
  40. style="width: 100%">
  41. <el-table-column
  42. prop="id"
  43. label="ID"
  44. width="180">
  45. </el-table-column>
  46. <el-table-column
  47. prop="name"
  48. label="姓名">
  49. </el-table-column>
  50. <el-table-column
  51. prop="amount1"
  52. sortable
  53. label="数值 1">
  54. </el-table-column>
  55. <el-table-column
  56. prop="amount2"
  57. sortable
  58. label="数值 2">
  59. </el-table-column>
  60. <el-table-column
  61. prop="amount3"
  62. sortable
  63. label="数值 3">
  64. </el-table-column>
  65. </el-table>
  66. </div>
  67. </template>
  68. <script>
  69. export default {
  70. data() {
  71. return {
  72. tableData: [
  73. {
  74. id: "12987122",
  75. name: "王小1虎",
  76. amount1: "234",
  77. amount2: "3.2",
  78. amount3: 10
  79. },
  80. {
  81. id: "12987121",
  82. name: "王小虎",
  83. amount1: "324",
  84. amount2: "4.43",
  85. amount3: 12
  86. },
  87. {
  88. id: "12987125",
  89. name: "王小虎",
  90. amount1: "621",
  91. amount2: "1.9",
  92. amount3: 9
  93. },
  94. {
  95. id: "12987125",
  96. name: "王小21虎",
  97. amount1: "621",
  98. amount2: "2.2",
  99. amount3: 17
  100. },
  101. {
  102. id: "12987126",
  103. name: "王小2虎",
  104. amount1: "539",
  105. amount2: "2.2",
  106. amount3: 15
  107. }
  108. ],
  109. mergeResult: [],
  110. mergeResult2: [],
  111. props: ["name", "amount2"]
  112. };
  113. },
  114. created() {
  115. // 指定 count 取默认属性
  116. this.mergeResult = this.mergeColumnCells(this.tableData, 2);
  117. // 指定 props
  118. this.mergeResult2 = this.mergeColumnCells(this.tableData, 0, this.props);
  119. console.log(this.mergeResult);
  120. console.log(this.mergeResult2);
  121. },
  122. methods: {
  123. /**
  124. * 多列合并单元格,可以指定某列,下面的 count 和 props 参数,虽然都是非必须的,但是至少得保证有一个
  125. * @param {Array} data 需要处理的数据
  126. * @param {Number} count 非必须参数:需要合并单元格的列的总数量(满足从初始第一列至连续的 count 列的条件)
  127. * @param {Array} props 非必须参数:需要合并单元格的数据列对应的属性列表,示例:['id','name']
  128. * @returns {Array} 储存嵌套的每一列需要合并单元格的合并的格数,示例:[[1,1,2,0,1],[1,2,0,1,1]]
  129. * 两种不同方式的调用示例:
  130. * 指定 count 取默认属性:this.mergeResult = this.mergeColumnCells(this.tableData, 2);
  131. * 指定 props:this.mergeResult = this.mergeColumnCells(this.tableData, 0, this.props);
  132. * 完整的在线示例地址 [element table 多列合并单元格,可以指定某列](https://codepen.io/sunxiaochuan/pen/wvoOXzG)
  133. */
  134. mergeColumnCells(data, count, props) {
  135. if (data && data.length && (count || props)) {
  136. // 先获取到需要合并的属性列表
  137. props = props || [];
  138. // 不存在的话就依照 count 字段开始取默认名称
  139. if (!props.length) {
  140. for (const key in data[0]) {
  141. if (data[0].hasOwnProperty(key)) {
  142. props.push(key);
  143. }
  144. if (props.length === count) {
  145. break;
  146. }
  147. }
  148. }
  149. let saveData = [];
  150. for (let index = 0; index < props.length; index++) {
  151. const prop = props[index];
  152. // 设置初始化值
  153. saveData[index] = [];
  154. let dataList = saveData[index];
  155. // 数据计算
  156. for (let i = 0; i < data.length; i++) {
  157. const element = data[i];
  158. // 逻辑:默认的第一条 i === 0 数据将初始化单元格数量为 1,从第二条 i === 1 数据开始与上一条数据开始做属性比较,一致的话上一个单元格 += 1,相应的当前单元格需要置为 0,否则为默认值 1
  159. if (i === 0) {
  160. dataList.push(1);
  161. } else {
  162. // 判断与上一条数据对应的属性值是否一致,如果是的话上一个单元格需要自增 1,并设置当前的单元格为 0,否则为 1
  163. const prev = data[i - 1];
  164. if (element[prop] === prev[prop]) {
  165. dataList[i - 1] += 1;
  166. dataList.push(0);
  167. } else {
  168. dataList.push(1);
  169. }
  170. }
  171. }
  172. }
  173. return saveData;
  174. } else {
  175. return [];
  176. }
  177. },
  178. arraySpanMethod({ row, column, rowIndex, columnIndex }) {
  179. if (columnIndex < 2) {
  180. const _row = this.mergeResult[columnIndex][rowIndex];
  181. return [_row, 1];
  182. }
  183. },
  184. // 指定 props
  185. arraySpanMethod2({ row, column, rowIndex, columnIndex }) {
  186. const index = this.props.indexOf(column.property);
  187. if (index != -1) {
  188. const _row = this.mergeResult2[index][rowIndex];
  189. return [_row, 1];
  190. }
  191. }
  192. }
  193. }
  194. </script>

“后”言

codepen 在线示例:element table 多列合并单元格,可以指定某列