【vue+Element】el-table表格合并单元格

当后台管理系统中,表格是非常常见的。表格具有结构清晰、信息明确的特点,可以更快速的获取信息并找到所需内容。你是否遇到需要处理表格单元格合并的情况呢?比如用表格展示一个订单包含多条商品信息时,我们就需要合并单元格。下面就是我用 Element 的 Table 表格实现合并单元格的效果,欢迎大家一起来讨论~

效果:

具体实现代码:

<template>
  <el-table
    :data="tableData"
    border
    ref="table"
    :span-method="arraySpanMethod"
    style="width: 100%"
  >
    <el-table-column prop="userName" label="顾客姓名" width="80"></el-table-column>
    <el-table-column prop="orderNumber" label="订单号" width="130"></el-table-column>
    <el-table-column prop="goodName" label="商品名称"> </el-table-column>
    <el-table-column prop="goodPrice" label="单价(元)"> </el-table-column>
    <el-table-column prop="goodNumber" label="购买数量"> </el-table-column>
    <el-table-column prop="orderPrice" label="订单总价(元)" width="120"></el-table-column>
    <el-table-column prop="orderDate" label="开单时间" width="120"></el-table-column>
    <el-table-column fixed="right" label="操作" width="60">
      <template slot-scope="scope">
        <el-button type="text" size="small">查看</el-button>
      </template>
    </el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        {
          userId: 1001,
          userName: "唧唧",
          orderNumber: 202404100001,
          orderPrice: 35,
          orderDate: "2024-04-10",
          goods: [
            { goodId: 101, goodName: "薯片", goodNumber: 1, goodPrice: 10.0 },
            { goodId: 102, goodName: "雪糕", goodNumber: 5, goodPrice: 5.0 },
          ],
        },
        {
          userId: 1002,
          userName: "咩咩",
          orderNumber: 202404100002,
          orderPrice: 59.8,
          orderDate: "2024-04-10",
          goods: [
            { goodId: 103, goodName: "抽纸", goodNumber: 2, goodPrice: 29.9 },
          ],
        },
        {
          userId: 1003,
          userName: "汪汪",
          age: 16,
          orderNumber: 202404100003,
          orderPrice: 36.0,
          orderDate: "2024-04-10",
          goods: [
            { goodId: 102, goodName: "雪糕", goodNumber: 2, goodPrice: 5.0 },
            { goodId: 102, goodName: "矿泉水", goodNumber: 2, goodPrice: 3.0 },
            { goodId: 102, goodName: "口罩", goodNumber: 10, goodPrice: 2.0 },
          ],
        },
      ],
      arr: [],
      spanTableRow: {}
    }
  },
  mounted() {
    this.initData(this.tableData);
  },
  methods: {
    initData(data) {
      const tempdata = data.filter((item) => item.goods);
      let list = [];
      this.arr = [];
      let spanTableRow = {};
      tempdata.forEach((item, i, data) => {
        if (item.goods.length == 0) {
          list.push(item);
        } else {
          item.goods.forEach((e, j) => {
            list.push({
              ...item,
              ...e
            });
          });
        }
        let row = item.goods.length || 1;
        if (item && item.orderNumber) {
          spanTableRow[item.orderNumber] = {
            row: row,
            isSpan: -1,
          };
        }
      });
      this.spanTableRow = Object.assign({}, spanTableRow);
      this.tableData = list;
      this.tableData.forEach((item) => {
        item.id = item.orderNumber;
      });
      this.$nextTick(() => {
        this.$refs.table.doLayout();
      });
    },
    arraySpanMethod({ row, column, rowIndex, columnIndex }) {
      if (![2, 3, 4].includes(columnIndex)) {
        if ( this.spanTableRow[row.orderNumber] && (this.spanTableRow[row.orderNumber].isSpan == rowIndex || this.spanTableRow[row.orderNumber].isSpan === -1) ) {
          this.spanTableRow[row.orderNumber].isSpan = rowIndex;
          let rowspan = this.spanTableRow[row.orderNumber].row;
          return [rowspan, 1];
        } else {
          return [0, 0];
        }
      }
    }
  }
}
</script>

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过自定义合并规则来实现vue element-ui table单元格的动态合并。以下是一个简单的示例代码: ``` <template> <el-table :data="tableData" ref="multiTable" border> <el-table-column prop="name" label="Name" width="180"> </el-table-column> <el-table-column prop="age" label="Age" width="180"> </el-table-column> <el-table-column prop="gender" label="Gender" width="180" :cell-style="{padding: '0px'}" :render-header="renderHeader" :render-cell="renderCell"> </el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: 'Tom', age: 18, gender: 'M' }, { name: 'Jane', age: 22, gender: 'F' }, { name: 'John', age: 28, gender: 'M' }, { name: 'Lisa', age: 24, gender: 'F' } ] } }, methods: { // 自定义表头渲染函数 renderHeader(h, { column }) { if (column.property === 'gender') { return h('div', [ h('span', 'Gender'), h('el-checkbox', { on: { change: this.handleMultiHeaderChange } }) ]) } else { return h('div', column.label) } }, // 自定义单元格渲染函数 renderCell(h, { row, column }, index) { const rowspan = this.getMultiRowspan(row, column) if (rowspan === 0) { return '' } else { return h('div', { style: { lineHeight: `${80 * rowspan}px` }, attrs: { rowspan: rowspan } }, row.gender) } }, // 计算单元格跨行数 getMultiRowspan(row, column) { const data = this.tableData let rowspan = 1 let currentIndex = data.indexOf(row) for (let i = currentIndex + 1; i < data.length; i++) { if (data[i][column.property] === row[column.property]) { rowspan++ } else { break } } return rowspan }, // 表头复选框改变事件 handleMultiHeaderChange(value) { const table = this.$refs.multiTable const columns = table.columns columns.forEach((column) => { if (column.property === 'gender') { column.filteredValue = value ? ['M', 'F'] : [] table.store.commit('filterChange', { column: column }) } }) } } } </script> ``` 在这个示例代码中,我们使用了自定义渲染函数来渲染表格,其中: - `renderHeader` 函数用于渲染表头,其中包含一个复选框来控制表格的动态合并; - `renderCell` 函数用于渲染单元格,其中通过 `getMultiRowspan` 函数计算出单元格需要跨越的行数。 需要注意的是,这里的示例代码仅供参考,具体实现可能会因为表格数据结构和合并规则的不同而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值