vue2&Element-ui实现表格单元格合并

由于项目需要实现单元格合并目前只是单页没有做分页处理先上效果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看下数据结构
在这里插入图片描述
Element table提供的api arraySpanMethod
在这里插入图片描述
在这里插入图片描述
columnIndex=0表示从第一列开始 rowIndex表示需要操作的行数
同济医院加上合计有12行从0开始<=11
判断条件是rowIndex余12===0
在这里插入图片描述
我们打印一下
在这里插入图片描述
在这里插入图片描述
或者改成在这里插入图片描述
表示从0开始到12行合并为一行
效果已实现后期在详细分析下下面是代码


```javascript
在这里插入代码片
<template>
  <div>
    <div class="table">
      <el-table
        :header-row-style="{
          height: '40px',
        }"
        :row-style="{ height: '40px' }"
        :cell-style="{ padding: '1px', background: '#oldlace' }"
        :data="tableData1"
        style="width: 100%"
        :span-method="arraySpanMethod"
        empty-text="统计中"
        :row-class-name="tableRowClassName"
      >
        <el-table-column
          align="center"
          prop="v0"
          label="名称"
        ></el-table-column>
        <el-table-column
          algin="center"
          prop="leader"
          label="市领导"
        ></el-table-column>
        <el-table-column
          align="center"
          prop="v1"
          label="问题数量"
        ></el-table-column>
        <el-table-column align="center" label="问题类型">
          <el-table-column align="center" prop="v2" label="基础设施">
          </el-table-column>
          <el-table-column
            align="center"
            prop="v3"
            label="民生保障"
          ></el-table-column>
          <el-table-column
            align="center"
            prop="v4"
            label="社会治理"
          ></el-table-column>
          <el-table-column
            align="center"
            prop="v5"
            label="生产经营"
          ></el-table-column>
          <el-table-column
            align="center"
            prop="v6"
            label="生态环保"
          ></el-table-column>
        </el-table-column>
        <el-table-column
          align="center"
          prop="v7"
          label="办结数量"
        ></el-table-column>
        <el-table-column align="center" prop="v8" label="办结率">
          <template slot-scope="scope">
            <span>{{ scope.row | rate }}</span>
          </template>
        </el-table-column>
        <el-table-column align="center" label="群众满意度">
          <el-table-column
            align="center"
            prop="v9"
            label="满意"
          ></el-table-column>
          <el-table-column
            align="center"
            prop="v10"
            label="一般"
          ></el-table-column>
          <el-table-column
            align="center"
            prop="v11"
            label="不满意"
          ></el-table-column>
        </el-table-column>
      </el-table>
    </div>
  </div>
</template>

```javascript
在这里插入代码片
  arraySpanMethod({ row, column, rowIndex, columnIndex }) {
      //同济医院
      if (columnIndex === 0 && rowIndex <= 11) {
        console.log(rowIndex % 12)
        if (rowIndex === 0) {
          return {
            rowspan: 12,
            colspan: 1,
          }
        } else {
          return {
            rowspan: 0,
            colspan: 0,
          }
        }
      }
      //同济医院第二行合并
      if (columnIndex === 1 && rowIndex <= 9) {
        if (rowIndex % 2 === 0) {
          return {
            rowspan: 2,
            colspan: 1,
          }
        } else {
          return {
            rowspan: 0,
            colspan: 0,
          }
        }
      }
      //协和医院
      if (columnIndex === 0 && rowIndex > 11 && rowIndex <= 19) {
        // if (rowIndex % 4 === 0) {
        //   return [4, 1]
        // } else {
        //   return [0, 0]
        // }
        if ((rowIndex - 4) % 8 === 0) {
          return [8, 1]
        } else {
          return [0, 0]
        }
      }
      //妇幼保健院
      if (columnIndex === 0 && rowIndex > 19 && rowIndex <= 29) {
        if (rowIndex % 10 === 0) {
          return [10, 1]
        } else {
          return [0, 0]
        }
      }
      //人民医院
      if (columnIndex === 0 && rowIndex > 29 && rowIndex <= 35) {
        if (rowIndex % 6 === 0) {
          return [6, 1]
        } else {
          return [0, 0]
        }
      }
    },

代码仓库
码云: https://gitee.com/db121/vue_admin
github: https://github.com/121066/vue-admin-pc

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值