当前位置:   article > 正文

el-table合并行

el-table合并行

借鉴了小谷69同学的帖子,又根据自己的需求进行了调整。

 需求为:序号根据业务id合并,合并后的业务数据再根据时间进行二次合并。

一、准备两个变量

  1. data() {
  2. return {
  3. // 合并行
  4. mergeArr: [],
  5. // 排序号
  6. indexNum: {},
  7. }
  8. }

二、准备合并行方法

  1. colMethod(columnArr, data) {
  2. // columnArr 合并行所在的列字段
  3. // data 需要合并的表格数据
  4. let column = {}
  5. let position = 0
  6. // 遍历合并的列数据
  7. columnArr.forEach((prop) => {
  8. column[prop] = []
  9. // 遍历合并的行数据
  10. data.forEach((row, rowIndex) => {
  11. // 第N列第一行
  12. column[prop][rowIndex] = [1, 1]
  13. if (rowIndex === 0) {
  14. // 记录当前行号
  15. position = 0
  16. } else if (row[prop] === data[rowIndex - 1][prop]) {
  17. // 当前行数据等于上一行,根据记录的行号,计算需要合并几行。
  18. column[prop][position][0] += 1
  19. // 当前行 隐藏不显示
  20. column[prop][rowIndex][0] = 0
  21. } else {
  22. // 不相等之后,重置记录行号
  23. position = rowIndex
  24. }
  25. })
  26. })
  27. return column
  28. }

三、准备表格调用的合并方法 :span-method="objectSpanMethod

  1. // 表格调用的合并方法
  2. objectSpanMethod({ row, column, rowIndex, columnIndex }) {
  3. let arr = this.mergeArr[column.property] || []
  4. if (column.type == 'index' && this.mergeArr['id'])
  5. return this.mergeArr['id'][rowIndex]
  6. else if (arr.length) return arr[rowIndex]
  7. else[1, 1]
  8. },

四、合并逻辑

  1. getList() {
  2. const _this = this;
  3. // 计算合并的行
  4. this.mergeArr = this.colMethod(['id'], this.reportList)
  5. // 浅拷贝处理数据
  6. let dataBase = Array.from(this.reportList);
  7. let saleIdArr = this.colMethod(['id'], dataBase)
  8. // 先根据saleId合并第一次,将数据源根据合并下标处理为多段数据源
  9. let newData = []
  10. saleIdArr.saleId.forEach( (item, index) => {
  11. if (item[0] > 0) {
  12. let res = []
  13. for (let i = 0; i < item[0]; i++) {
  14. res.push(dataBase.slice(0,1)[0])
  15. this.$delete(dataBase, 0)
  16. }
  17. newData.push(res)
  18. }
  19. })
  20. // 根据合并后的数据,分段处理time的合并行下标
  21. let outArr = []
  22. for (let i = 0; i < newData.length; i++) {
  23. let obt = _this.colMethod(['time'], newData[i]);
  24. if (obt.outboundTime.length > 0) {
  25. outArr.push(obt.outboundTime)
  26. }
  27. }
  28. // 处理time合并行
  29. let finishRes = []
  30. outArr.forEach( item => {
  31. if (item.length > 1) {
  32. for (let i = 0; i < item.length; i++) {
  33. finishRes.push(item[i])
  34. }
  35. } else {
  36. finishRes.push(item[0])
  37. }
  38. })
  39. // 赋值给总合并行集合
  40. this.mergeArr.outboundTime = finishRes
  41. //排列序号
  42. this.indexObj()
  43. }
  44. // 排列序号
  45. indexObj() {
  46. let num = 0;
  47. this.mergeArr['id'].forEach((item, index) => {
  48. if (item[0] != 0) {
  49. this.indexNum[index] = num += 1
  50. }
  51. })
  52. },
  53. <el-table-column label="序号" align="center" width="55" type="index"
  54. :resizable="false" :index="indexMethod" />

五、处理排序

  1. <el-table-column label="序号" align="center" width="55" type="index"
  2. :resizable="false" :index="indexMethod" />
  3. // 排列序号
  4. indexObj() {
  5. let num = 0;
  6. this.mergeArr['id'].forEach((item, index) => {
  7. if (item[0] != 0) {
  8. this.indexNum[index] = num += 1
  9. }
  10. })
  11. },
  12. // 自定义序号
  13. indexMethod(index) {
  14. return this.indexNum[index]
  15. },

借鉴文章el-table表格的行合并以及合并后序号的处理_elementui表格合并行序号出错_小谷69的博客-CSDN博客

 附加:原生table合并行

需求不变,因打印功能,el-table适配性不好,改为原生table布局,合并行要素为rowspan,所以在遍历数据时要分开控制rowspan,同理根据业务id分段数据源,分别处理各自的time合并行

  1. <tr v-for="(item, index) in reportList" :key="index" class="text-center">
  2. <td style="width: 60px" v-if="item.rowspan > 0" :rowspan="item.rowspan">{{ item.orderList }}</td>
  3. <td style="width: 150px" v-if="item.rowspans > 0" :rowspan="item.rowspans">{{ item.time }}</td>
  4. </tr>
  5. getList() {
  6. // 根据saleId计算合并的行
  7. let saleIdSpan = this.getSpanArrN(this.reportList, 'id')
  8. let orderList = 1
  9. saleIdSpan.forEach((item, index) => {
  10. this.reportList[index].rowspan = item
  11. this.reportList[index].orderList = item > 0 ? orderList++ : orderList
  12. })
  13. // 浅拷贝表格数据,用于分段截取
  14. let dataBase = Array.from(this.reportList);
  15. // 先根据saleId一级合并行,将数据源根据合并下标处理为多段数据源
  16. let newData = []
  17. saleIdSpan.forEach( (item, index) => {
  18. if (item > 0) {
  19. let res = []
  20. for (let i = 0; i < item; i++) {
  21. res.push(dataBase.slice(0,1)[0])
  22. this.$delete(dataBase, 0)
  23. }
  24. newData.push(res)
  25. }
  26. })
  27. // 根据合并后的数据,分段处理outboundTime的合并行下标
  28. let outArr = []
  29. for (let i = 0; i < newData.length; i++) {
  30. let obt = this.getSpanArrN(newData[i], 'time')
  31. outArr = outArr.concat(obt)
  32. }
  33. // 赋值outboundTime合并行
  34. outArr.forEach((item, index) => {
  35. this.reportList[index].rowspans = item
  36. })
  37. },
  38. getSpanArrN(data, prop) {
  39. let count = 0; // 用来记录需要合并行的起始位置
  40. let mergeObj = []
  41. data.forEach((item, index) => {
  42. if (index === 0) {
  43. mergeObj.push(1);
  44. } else {
  45. if (item[prop] === data[index - 1][prop]) {
  46. mergeObj[count] += 1;
  47. mergeObj.push(0);
  48. } else {
  49. count = index;
  50. mergeObj.push(1);
  51. }
  52. }
  53. })
  54. return mergeObj
  55. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号