element-ui el-table 如何实现合并单元格

el-table的组件的可以合并单元格,先定义参数span-method 方法objectSpanMethod。在方法内控制当前单元格渲染成几个单元格或者删除掉当前单元格。

比如:代码中定义:span-method="objectSpanMethod"

 <el-table
          :data="media_showid_info.showids"
          style="width: 100%"
          max-height="250"
          border
          :span-method="objectSpanMethod"
        >
          <el-table-column prop="id" label="id" width="120">
          </el-table-column>
          <el-table-column
            prop="type_name"
            label="类型"
            width="120"
          >
          </el-table-column>
          <el-table-column prop="time" label="时间" width="210">
          </el-table-column>
          <el-table-column prop="no." label="编号" width="120">
          </el-table-column>
          <el-table-column prop="match" label="位置" width="120">
            <template slot-scope="scope">
              <span v-if="'match' in scope.row"
                >{{ scope.row.match }}</span
              >
              <span v-else style="color: #c0c4cc; font-size: small">无</span>
            </template>
          </el-table-column>
          <el-table-column label="操作">
            <template slot-scope="scope" v-if="scope.row.match">
              <el-button
                @click.native.prevent="
                  check_result(scope.row.id, scope.row.match)
                "
                type="text"
                size="small"
              >
                查看
              </el-button>
            </template>
          </el-table-column>
        </el-table>

objectSpanMethod实现是在方法区,具体内容是根据变量rowSpanList 去决定当前单元格是展示还是删除,展示的话是展示几行一列。

 objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (row && columnIndex == 0 && column.label === "广告位showid") {
        if (this.rowSpanList && this.rowSpanList[rowIndex]) {
          let rowSpan = this.rowSpanList[rowIndex];
          return [rowSpan, 1];
          // 相同id有几个就绘制成几行一列
        } else {
          return [0, 0];
          // 重复的id值,已经绘制过,不需要在展示id了,删除掉改单元格的绘制
        }
      }
    },

 { row, column, rowIndex, columnIndex }四个参数表示row行数据,column列数据,rowIndex行标,columnIndex列标

rowSpanList是记录id分布的, 是在展示数据获取及处理时计算生成的,大致逻辑是

若当前id与列表中上一个数据的id相同:

 if ( this.info.sids[i].id ===this.info.sids[i - 1].id) 

该相同id的起始位置标记是position

相同的话计数rowSpanList加1:this.rowSpanList[position] += 1

              this.rowSpanList = [];
              var position = 0;
              for (var i in this.info.sids) {
                if (i === "0") {
                  position = 0;
                  this.rowSpanList.push(1);
                } else {
                  if (
                    this.info.sids[i].id ===
                    this.info.sids[i - 1].id
                  ) {
                    this.rowSpanList[position] += 1; //项目名称相同,合并到同一个数组中
                    this.rowSpanList.push(0);
                  } else {
                    this.rowSpanList.push(1);
                    position = i;
                  }
                }

最后this.rowSpanList可能值是[2,0,3,0,0,1]

数字2表示有两个一样的,在table渲染中表示该单元格需要占位2行1列。

0表示跟上一个id一样,不需要标记,在table渲染中表示该单元格需要删除。

element-ui的表格el-table本身并不支持动态合并单元格(行和列),但可以通过自定义表格的slot-scope和span-method来实现动态合并单元格的功能。首先,我们需要在表格定义时添加span-method属性,并指定一个方法来计算单元格的合并行数和列数。例如: ```html <el-table :data="tableData" :span-method="mergeCells"> ... </el-table> ``` 然后,在methods中定义mergeCells方法来计算单元格的合并行数和列数。该方法有四个参数分别是({row, column, rowIndex, columnIndex}),我们可以根据需要通过判断行索引和列索引来返回合适的行数和列数,例如合并第一行的两列可以这样实现: ```javascript methods: { mergeCells({row, column, rowIndex, columnIndex}) { if (rowIndex === 0 && columnIndex < 2) { return { rowspan: 1, colspan: 2 }; } } } ``` 这样就实现了动态合并第一行的两个单元格。如果想要合并其他行或列,可以根据需要进行判断和返回。 给表头添加斜线可以通过自定义表头的样式来实现。可以通过CSS的`::before`或`::after`伪元素来添加斜线样式。例如,给第一列的表头添加斜线可以这样实现: ```html <el-table ...> <el-table-column label="姓名"> <template slot="header" slot-scope="scope"> <div class="header-wrapper"> <div class="header-content"> <span>{{scope.column.label}}</span> </div> </div> </template> </el-table-column> ... </el-table> ``` 然后在样式中定义斜线效果: ```css <style> .header-content::before { content: ""; display: block; border-bottom: 1px solid #333; transform: skew(-45deg); width: 80%; margin-left: 10%; } </style> ``` 这样就实现了给第一列的表头添加斜线的效果。可以根据需要调整斜线的样式和位置来达到期望的效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值