Element的表格el-table合计显示多行,以及合计行合并单元格

效果展示

一、合计显示多行

此处采用换行的思路,让页面上显示多行,使用到html的换行符<br/>

步骤1:el-table标签加上方法:summary-method="getSummaries"

<el-table
      id="table"
      :data="tableList"
      border
      :summary-method="getSummaries"
      show-summary
    >

步骤2:getSummaries方法下的具体实现

1.换行主要代码:sums[index] =  <p>当前页面总计<br/><br/>总计</p>;

2.合计第一行可显示页面原本相加的合计值,第二行显示后端动态数据返回的值,主要代码:
if (column.property == 'total') {
    sums[index] = <p>
      {countArr[index]}<br/><br/>//第一行数据是当前页面值相加
       {this.apiData.account}<br/><br/>//第二行数据是后端接口返回
       </p>
}

getSummaries(param) {
      const { columns, data } = param;
      const sums = [];
      columns.forEach((column, index) => {
        if (index === 0) {
          // 通过<br/>实现换行,达到2行的效果
          sums[index] =  <p>当前页面总计<br/><br/>总计</p>;
          return;
        }
        
        let countArr = [];//element原本的总计:当前页面计算的值 集合
        const values = data.map((item) => Number(item[column.property]));
        if (!values.every((value) => isNaN(value))) {
          countArr[index] = values.reduce((prev, curr) => {
            const value = Number(curr);
            if (!isNaN(value)) {
              return prev + curr;
            } else {
              return prev;
            }
          }, 0);
          // 根据列表字段判断 取值
          if (column.property == 'total') {
            sums[index] = <p>
                {countArr[index]}<br/><br/>//第一行数据是当前页面值相加
                {this.apiData.account}<br/><br/>//第二行数据是后端接口返回
              </p>
          }
        } else {
          sums[index] = "-";
        }
      });
      return sums;
    },

注意:直接在vue页面写jsx语法有可能会报错,此时需要安装@vue/babel-preset-jsx插件

npm install @vue/babel-preset-jsx --save

安装好后在.babelrc文件下新增配置,@vue/babel-preset-jsx,然后重新运行代码就可以了

{
  "presets": [
    ["@babel/preset-env", {
      "modules": false,
      "targets": {
        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
      }
    }],
    "@vue/babel-preset-jsx" //支持jsx语法
  ]
}

此时页面效果,已有2行,但未合并单元格

二、合计行合并单元格

通过监听表格数据,获取到表格合计行的dom节点,进行dom操作,setTimeout表示等页面渲染完后在进行操作,表格如果有固定列,使用下面的代码,没有固定列,使用注释的那一行代码

watch: {
    tableList: {// 表格数据
      immediate: true,
      handler() {
        setTimeout(() => {
          // const tds = document.querySelectorAll('#table .el-table__footer-wrapper tr>td');//表格没有固定列时 写法
          const tds = document.querySelectorAll('#table .el-table__fixed-footer-wrapper tr>td');//表格有固定列时 写法
          tds[0].colSpan = 2;
          tds[0].style.textAlign = 'center'
          tds[1].style.display = 'none'
        }, 0)
      }
    }
  },

### Element Plus `el-table` 组件实现多行合并Element Plus框架中的`el-table`组件支持通过自定义函数来控制哪些单元应该被合并。对于基于特定属性值相同的合并的情况,可以利用`span-method`属性提供的回调函数。 当表格数据加载完毕后,在遍历每一的数据时判断相邻之间指定字段的内容是否相等;如果相等,则设置当前该列的高度跨越数(rowSpan),并将下一对应位置设为0表示隐藏[^1]。 下面是一个简单的例子用于说明如何根据某个属性(例如name)来进的自动合并: ```html <template> <div style="margin: 20px;"> <el-table :data="tableData" border :span-method="objectSpanMethod"> <el-table-column prop="date" label="日期"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="amount1" label="数值 1"></el-table-column> <el-table-column prop="amount2" label="数值 2"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </div> </template> <script setup lang="ts"> import { ref } from 'vue' const tableData = [ { date: "2016-05-03", name: "Tom", amount1: "1", amount2: "2", address: "No. 189, Grove St, Los Angeles" }, { date: "2016-05-02", name: "Tom", // 和上一条记录的名字一样 amount1: "2", amount2: "3", address: "No. 189, Grove St, Los Angeles" } ] // 定义一个对象用来存储每组连续相同项的数量 let countMap = new Map() function objectSpanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 1) { // 只处理第二列即'name'这一列 const currentValue = row[column.property]; let prevValue; if(rowIndex !== 0){ prevValue = tableData[rowIndex - 1][column.property]; } if(currentValue===prevValue){ // 如果当前值等于前一值则返回{ rowspan: 0, colspan: 0 },意味着这不会显示出来 return { rowspan: 0, colspan: 0 }; }else{ // 否则计算有多少个连续相同的元素并更新countMap映射表 let nextIndex=rowIndex+1; while(nextIndex<tableData.length && tableData[nextIndex][column.property]==currentValue){ nextIndex++; } countMap.set(`${rowIndex}-${columnIndex}`,nextIndex-rowIndex); return { rowspan: nextIndex-rowIndex , colspan: 1}; } } } </script> ``` 此代码片段展示了怎样创建一个具有合并功能的表格,并且指定了具体的逻辑去决定何时以及如何合并某些下的单元。注意这里只针对"name"这个字段做了特殊处理,实际应用中可以根据需求调整条件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值