Element表格之表头合并、单元格合并

一、合并表头

el-table配置 :header-cell-style="headFirst"



headFirst({ row, colunm, rowIndex, columnIndex }) {
      let base = { 'background-color': 'rgba(67, 137, 249, 0.3)', color: '#333', 'text-align': 'center' };
      //这里为了是将第一列的表头隐藏,就形成了合并表头的效果
      if (rowIndex === 0) {
      // 判断对第几列合并  property就是prop传入的属性
        if (row[columnIndex].property === 'part1') {
          //第一列width扩展2倍
          return { ...base, width: '200%', display: 'inline-block' };
        } else if (row[columnIndex].property === 'part2') {
          //其余列设置font-size 0 隐藏
          return { 'font-size': 0 };
        }
      }
      return base;
    },

二、合并表格行

要进行单元格合并,关键在于你要对数据渲染的前进行判断处理,在这里,首先要在el-table中配置写入 :span-method='spanMethod'  ,然后在js部分写上方法。

spanMethod({ row, column, rowIndex, columnIndex }, key) {
      if (columnIndex === 0) {
        let data = [];
        data = this.dataMap[key].tableData;
        const _row = this.flitterData(data).arr[rowIndex];
        const _col = _row > 0 ? 1 : 0;
        return {
          rowspan: _row,
          colspan: _col,
        };
      }
    },
    flitterData(arr) {
      let spanOneArr = [];
      let concatOne = 0;
      arr.forEach((item, index) => {
        if (index === 0) {
          spanOneArr.push(1);
        } else {
          if (item && arr[index - 1] && item.name === arr[index - 1].name) {
            // 第一列需合并相同内容的判断条件
            spanOneArr[concatOne] += 1;
            spanOneArr.push(0);
          } else {
            spanOneArr.push(1);
            concatOne = index;
          }
        }
      });
      return {
        arr: spanOneArr,
      };
    },

一、合并表格列

如果合并表格行的同时还要考虑合并表格列可以修改spanMethod方法;

另外element的事件想要传输额外的参数 可以用 :spanMethod="(obj) => spanMethod(obj, key)" 设置多个列的单元格合并

spanMethod({ row, column, rowIndex, columnIndex }, key) {
      if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2) {
        let data = [];
        data = this.dataMap[key].tableData;
        const _row = this.flitterData(data, column.property).arr[rowIndex];
        const _col = _row > 0 ? this.colData(data, row, columnIndex) : 0;
        return {
          rowspan: _row,
          colspan: _col,
        };
      }
    },
    colData(arr, row, columnIndex) {
      // 计算横向合并单元格
      if (columnIndex === 1 && row.part1 === row.part2) {
        return 2;
      } else if (columnIndex === 2 && row.part1 === row.part2) {
        return 0;
      }
      return 1;
    },
    flitterData(arr, key) {
      let spanOneArr = [];
      let concatOne = 0;
      arr.forEach((item, index) => {
        if (index === 0) {
          spanOneArr.push(1);
        } else {
          if (item && arr[index - 1] && item[key] === arr[index - 1][key]) {
            // 第一列需合并相同内容的判断条件
            spanOneArr[concatOne] += 1;
            spanOneArr.push(0);
          } else {
            spanOneArr.push(1);
            concatOne = index;
          }
        }
      });
      return {
        arr: spanOneArr,
      };
    },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值