vue + element 表格 根据某一属性合并行

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020030216452264.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcxMzQ0Ng==,size_16,color_FFFFFF,t_70

 				<el-table
                    :data="assessJson.rows"
                    highlight-current-row
                    border
                    style="width: 100%"
                    :span-method="objectSpanMethod"
                   >
                   <el-table-column
                      prop="quotaType"
                      label="指标类型"
                      align="center"
                      width="180">
                      <template slot-scope="scope">
                    <span>{{ scope.row.quotaType | invoiceStatusFilter }}</span>
                      </template>
                    </el-table-column>
// 因为要合并的行数是不固定的,此函数是实现合并随意行数的功能
    getSpanArr(data) {
      this.spanArr = [];
      for (var i = 0; i < data.length; i++) {
        if (i === 0) {
          // 如果是第一条记录(即索引是0的时候),向数组中加入1
          this.spanArr.push(1);
          this.pos = 0;
        } else {
          if (data[i].quotaType === data[i - 1].quotaType) {
            // 如果quotaType相等就累加,并且push 0  这里是根据一样的quotaType匹配
            this.spanArr[this.pos] += 1;
            this.spanArr.push(0);
          } else {
            // 不相等push 1
            this.spanArr.push(1);
            this.pos = i;
          }
        }
      }
    },
    //合并行数
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      // columnIndex === 0 找到第一列,实现合并随机出现的行数
      if (columnIndex === 0) {
        const _row = this.spanArr[rowIndex];
        const _col = _row > 0 ? 1 : 0;
        return {
          rowspan: _row,
          colspan: _col
        };
      };
      if (rowIndex === 0) {
          if (columnIndex === 8) { //这两个判断是定位到要合并的那个单元格
          const listVal = this.assessJson.length; //最后总分合并所有行
            return {
              rowspan: listVal, //合并几行 原本的多行变为单行
              colspan: 1 //合并几列
            };
          }
        }
    },
 //考核标准获取
    assessList(){
      let param = Object.assign({}, this.QuotaPagesVal);
      apis.handBookApi
        .apis(param)
        .then(data => {
         if (data && data.data) {
            var json = data.data;
            if (json && json.code == 1) {
              console.log("考核标准");
              console.log(json.rows);
              this.QuotaPagesVal.total = json.records;
              let transferList = [];
              let transferList2 = [];
              let transferList3 = [];
              json.rows.forEach(item => { //循环接口返回数组 同类型的放一起
                if(item.quotaType == 1){
                  transferList.push(item);
                }else if(item.quotaType == 2){
                  transferList2.push(item);
                }else if(item.quotaType == 3){
                  transferList3.push(item);
                }
              });
              transferList.push(...transferList2); //按顺序合并成一个数组
              transferList.push(...transferList3);
              console.log("合并后的数组");
              console.log(transferList);
              this.getSpanArr(transferList); //transferList
              this.assessJson = transferList;
              console.log("处理过的数据");
              console.log(transferList);
              return
            }
          }
        })
        .catch(err => {
          this.$message({ message: "考核标准列表查询异常,请重试", type: "error" });
      });
    },
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以通过自定义合并规则来实现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` 函数计算出单元格需要跨越的数。 需要注意的是,这里的示例代码仅供参考,具体实现可能会因为表格数据结构和合并规则的不同而有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值