使用 vxe-table 的 :span-method="mergeRowMethod"多列字段合并行方法

344 阅读1分钟

使用 vxe-table 的 :span-method="mergeRowMethod"多列字段合并行方法:

mergeRowMethod ({ row, _rowIndex, column, visibleData }) {
      // 定义要检查的字段列表
      const fields = ['sku', 'creator']
      // 获取上一行数据
      const prevRow = visibleData[_rowIndex - 1]
      // 初始化下一行数据
      let nextRow = visibleData[_rowIndex + 1]
      // 获取当前单元格的值
      const cellValue = row[column.property]
      // 查找当前字段在字段列表中的索引
      const fIndex = fields.findIndex(e => e === column.property)
      // 如果单元格的值存在且是当前字段
      if (cellValue && fields.includes(column.property)) {
        // 初始化检查字段的标记
        let checkField = prevRow && true
        // 从当前字段开始向前遍历字段列表
        for (let index = fIndex; index >= 0; index--) {
          // 检查上一行和当前行的对应字段是否相等
          checkField = checkField && prevRow[fields[index]] && row[fields[index]] && prevRow[fields[index]] === row[fields[index]]
        }
        // 如果检查字段标记为真
        if (checkField) {
          // 返回rowspan和colspan都为0的对象
          return {rowspan: 0, colspan: 0}
        // 如果检查字段标记为假
        } else {
          // 初始化跨行数量
          let countRowspan = 1
          // 初始化检查下一个字段的标记
          let checkNextField = true
          // 当检查下一个字段的标记为真时,循环检查
          while (checkNextField) {
            // 从当前字段开始向前遍历字段列表
            for (let index = fIndex; index >= 0; index--) {
              // 检查下一行和当前行的对应字段是否相等
              checkNextField = checkNextField && nextRow && nextRow[fields[index]] && row[fields[index]] && nextRow[fields[index]] === row[fields[index]]
            }
            // 验证下一个行是否符合条件
            // 如果检查下一个字段的标记为真,则更新下一行数据并增加跨行数量
            // 验证下一个行是否符合条件
            if (checkNextField) nextRow = visibleData[++countRowspan + _rowIndex]
          }
          // 如果跨行数量大于1
          if (countRowspan > 1) {
            // 返回rowspan为跨行数量,colspan为1的对象
            return { rowspan: countRowspan, colspan: 1 }
          }
        }
      }
    },