el-table合并单元格

这个是后端返回的数据结构,按id字段,把相同内容的单元格的进行合并

javascript 复制代码
<el-table
        border
        v-loading="tableLoading"
        element-loading-text="数据加载中"
        :data="tableData"
        :span-method="mergeRows"
        :height="tableMaxHeight">
        <el-table-column type="selection" prop="index" width="55"></el-table-column>
        <el-table-column label="序号" prop="index" width="50" fixed="left"></el-table-column>
        <el-table-column label="单据编号" prop="documentCode" min-width="150" :show-overflow-tooltip="true" />
        <el-table-column label="单据类型" prop="documentType" :show-overflow-tooltip="true">
          <template slot-scope="scope">
            <dict-tag :options="dict.type.document_type" :value="scope.row.documentType"></dict-tag>
          </template>
        </el-table-column>
        <el-table-column label="单据日期" prop="documentDate" min-width="120" :show-overflow-tooltip="true" />
        <el-table-column label="单据状态" prop="status" :show-overflow-tooltip="true">
          <template slot-scope="scope">
            <dict-tag :options="dict.type.document_status" :value="scope.row.status"></dict-tag>
          </template>
        </el-table-column>
        <el-table-column label="物料编码" prop="partCode" min-width="100" :show-overflow-tooltip="true" />
        <el-table-column label="物料名称" prop="partName" :show-overflow-tooltip="true" />
        <el-table-column label="申购数量" prop="quantityNum" :show-overflow-tooltip="true" />
        <el-table-column label="项目主数据" prop="projectData" min-width="110" :show-overflow-tooltip="true" />
        <el-table-column label="项目名称" prop="projectName" :show-overflow-tooltip="true" />
        <el-table-column label="申请人员" prop="applicant" min-width="100" :show-overflow-tooltip="true" />
        <el-table-column label="申请部门" prop="deptName" min-width="120" :show-overflow-tooltip="true" />
        <el-table-column label="采购人员" prop="purchasePerson" min-width="120" :show-overflow-tooltip="true" />
        <el-table-column label="已转采购数" prop="convertedNum" min-width="110" :show-overflow-tooltip="true" />
        <el-table-column label="未转采购数" prop="unconvertedNum" min-width="110" :show-overflow-tooltip="true" />
      </el-table>
javascript 复制代码
data() {
    return {
        //需要合并的字段
        mergeFields: [
        "index",
        "documentCode",
        "documentType",
        "documentDate",
        "status",
        "applicant",
        "deptName",
        "purchasePerson",
        "tool"
      ],
      // 合并规则
      mergeRules: {},
    }
},
methods: {
/**
     * 计算合并规则
     * @param {String} groupKey 分组依据字段(这里用id)
     */
    calcMergeRules(groupKey) {
      const rules = {};
      // 初始化需要合并的字段规则
      this.mergeFields.forEach((field) => (rules[field] = []));
      let sameCount = 1; // 相同id的连续行数
      this.tableData.forEach((row, index) => {
        if (index === 0) {
          // 第一行默认占1行
          this.mergeFields.forEach((field) => rules[field].push(1));
        } else {
          // 判断与上一行是否同组
          const isSameGroup = row[groupKey] === this.tableData[index - 1][groupKey];
          if (isSameGroup) {
            sameCount++;
            // 当前行设为0(不显示),上一行累加
            this.mergeFields.forEach((field) => {
              rules[field].push(0);
              rules[field][index - sameCount + 1] = sameCount;
            });
          } else {
            // 不同组则重置计数
            sameCount = 1;
            this.mergeFields.forEach((field) => rules[field].push(1));
          }
        }
      });

      return rules;
    },

    /**
     * 合并单元格方法
     */
    mergeRows({ column, rowIndex }) {
      // 找到当前列对应的字段
      const field = column.property;
      // 如果是需要合并的字段,则应用规则
      if (this.mergeFields.includes(field)) {
        const rowspan = this.mergeRules[field][rowIndex];
        return { rowspan, colspan: rowspan > 0 ? 1 : 0 };
      }
      // 不需要合并的列返回默认值
      return { rowspan: 1, colspan: 1 };
    },
    // 调接口获取数据
    getList() {
      this.tableLoading = true;
      queryPurchaseReqList(this.queryParams)
        .then((res) => {
          if (res.code === 200) {
            this.tableData = res.rows || [];
            this.total = res.total;
            this.tableLoading = false;
            // 初始化合并规则(按id分组)
            this.mergeRules = this.calcMergeRules("id");
          }
        })
        .catch((err) => null);
    },
}

效果

通过以上方法就能实现合并了,主要用到了el-table的 span-method

这世界很喧嚣,做你自己就好

相关推荐
J***Q29216 小时前
Vue数据可视化
前端·vue.js·信息可视化
JIngJaneIL16 小时前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·社区互助
ttod_qzstudio17 小时前
深入理解 Vue 3 的 h 函数:构建动态 UI 的利器
前端·vue.js
芳草萋萋鹦鹉洲哦17 小时前
【elemen/js】阻塞UI线程导致的开关卡顿如何优化
开发语言·javascript·ui
1***s63218 小时前
Vue图像处理开发
javascript·vue.js·ecmascript
一 乐18 小时前
应急知识学习|基于springboot+vue的应急知识学习系统(源码+数据库+文档)
数据库·vue.js·spring boot
槁***耿18 小时前
JavaScript在Node.js中的事件发射器
开发语言·javascript·node.js
一叶茶18 小时前
移动端平板打开的三种模式。
前端·javascript
U***498318 小时前
JavaScript在Node.js中的Strapi
开发语言·javascript·node.js
老前端的功夫19 小时前
前端浏览器缓存深度解析:从网络请求到极致性能优化
前端·javascript·网络·缓存·性能优化