a-table行数据合并 + 动态表头生成

效果图展示

在这里插入图片描述

思路流程

  1. 后端返回数据二次处理
  2. 根据后端数据生成动态表头
  3. 利用antd 的 customRender 与 rowSpan 设置行合并

完整代码部分

<template>
  <div class="bg">
    <a-table
      bordered
      :columns="columns"
      :pagination="false"
      :dataSource="dataSource"
      :row-key="(record) => record.id"
    ></a-table>
  </div>
</template>
<script>
import { GetQualifiedDayData } from '@/services/LIMSApis/qualified'

export default {
  name: 'index',
  data() {
    return {
      columns: [],
      // 公共表头
      saveColumnsNode: [
        {
          title: '质量点名称',
          dataIndex: 'pointName',
          align: 'center',
          width: 150,
          customRender: (value, row, index) =>
            this.columnsInit(value, row, index, 3),
        },
        {
          title: '控制范围',
          dataIndex: 'limitRange',
          align: 'center',
          width: 100,
          customRender: (value, row, index) =>
            this.columnsInit(value, row, index, 3),
        },
        {
          title: '属性',
          dataIndex: 'attr',
          align: 'center',
          width: 120,
        },
      ],
      dataSource: [],
    }
  },
  mounted() {
    this.initTable()
  },
  methods: {
    async initTable() {
      // let res = await GetQualifiedDayData(this.params)
      // this.dataSource = this.nodeTable(res)
      // 接口获取数据,此处用data假数据代替返回值
      let data = {
        data: [
          {
            pointName: '名称1',
            limitRange: '<10',
            datas: [
              { date: '1月', valueMax: 100, valueMin: 5, numTotal: 30 },
              { date: '2月', valueMax: 120, valueMin: 15, numTotal: 60 },
              { date: '3月', valueMax: 70, valueMin: 4, numTotal: 50 },
              { date: '4月', valueMax: 60, valueMin: 15, numTotal: 40 },
              { date: '5月', valueMax: 200, valueMin: 2, numTotal: 70 },
              { date: '6月', valueMax: 150, valueMin: 7, numTotal: 90 },
            ],
          },
          {
            pointName: '名称2',
            limitRange: '<12',
            datas: [
              { date: '1月', valueMax: 53, valueMin: 1, numTotal: 55 },
              { date: '2月', valueMax: 86, valueMin: 2, numTotal: 87 },
              { date: '3月', valueMax: 97, valueMin: 2, numTotal: 98 },
              { date: '4月', valueMax: 87, valueMin: 3, numTotal: 89 },
              { date: '5月', valueMax: 97, valueMin: 4, numTotal: 99 },
              { date: '6月', valueMax: 68, valueMin: 2, numTotal: 67 },
            ],
          },
        ],
      }
      this.dataSource = this.nodeTable(data)
    },
    // 步骤一:数据二次处理
    // 原数据
    // {
    //   pointName: '名称1',
    //   limitRange: '<10',
    //   datas: [
    //     { date: '1月', valueMax: 100, valueMin: 5, numTotal: 30 },
    //     { date: '2月', valueMax: 120, valueMin: 15, numTotal: 60 },
    //     ...
    //   ],
    // },
    // 转换为
    // { pointName: '名称1', limitRange: '<10', attr: '最高值', data.1月: '100', data.2月: 120, ... }
    // { pointName: '名称1', limitRange: '<10', attr: '最低值', data.1月: '5', data.2月: 15, ... }
    // { pointName: '名称1', limitRange: '<10', attr: '总次数', data.1月: '30', data.2月: 60, ... }
    nodeTable(res) {
      let arr = []
      res.data.forEach((item) => {
        // 提取公共部分属性
        let commonObj = {
          pointName: item.pointName,
          limitRange: item.limitRange,
        }
        // 添加各自独有的属性值
        let valueMaxArr = { ...commonObj, attr: '最高值' }
        let valueMinArr = { ...commonObj, attr: '最低值' }
        let numTotalArr = { ...commonObj, attr: '总次数' }
        item.datas.forEach((item2) => {
          let str = item2.date
          valueMaxArr['data.' + str] = item2.valueMax
          valueMinArr['data.' + str] = item2.valueMin
          numTotalArr['data.' + str] = item2.numTotal
        })
        arr.push(valueMaxArr)
        arr.push(valueMinArr)
        arr.push(numTotalArr)
      })
      arr = arr.map((item, index) => {
        item.id = index + 1
        return item
      })
      console.log(arr, 'arar')
      // 公共表头 + 动态表头 生成 最终表头
      this.columns = [...this.saveColumnsNode, ...this.changeCoulmns(res)]
      return arr
    },
    // 步骤二:table表头二次处理
    // [
    //   {
    //     title: '1月',
    //     dataIndex: 'data.1月',
    //     align: 'center',
    //   },
    //   {
    //     title: '2月',
    //     dataIndex: 'data.2月',
    //     align: 'center',
    //   },
    //   ...
    // ]
    changeCoulmns(res) {
      let addColumns = []
      if (res.data.length) {
        addColumns = res.data[0].datas.map((item) => {
          let str = item.date
          return {
            title: str,
            dataIndex: `data.${str}`,
            align: 'center',
          }
        })
      }
      return addColumns
    },
    // 步骤三:行合并 rowSpan 设值为 0 时,设置的表格不会渲染。
    columnsInit(value, row, index, num) {
      const obj = {
        children: value,
        attrs: {},
      }
      if (index === 0 || index % num === 0) {
        obj.attrs.rowSpan = num
      }
      for (let i = 1; i <= num; i++) {
        if (index % num === i) {
          obj.attrs.rowSpan = 0
        }
      }
      return obj
    },
  },
}
</script>

<style>
.bg {
  background-color: #fff;
}
</style>
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要实现el-table多级表头动态改变表头数据,首先需要准备两组数据。一组数据用于实现表头的结构,另一组数据用于内容渲染。在el-table中,可以使用el-table-column标签嵌套的方式来实现多级表头。 在表头数据中,每个el-table-column代表一个表头列。可以使用label属性定义列名,prop属性定义对应的数据字段。如果有多级表头,可以通过嵌套el-table-column来实现。每个el-table-column可以设置子列,通过v-for循环遍历表头数据动态生成多级表头的结构。 在内容渲染时,可以使用prop属性来指定对应的数据字段进渲染。根据你提供的示例,可以使用v-for循环遍历表头数据中的子列来渲染内容。 通过以上的设置,当表头数据发生改变时,el-table动态生成对应的多级表头结构,并且根据内容渲染的数据渲染。你可以根据具体需求动态改变表头数据,并且保证内容渲染的数据结构与表头数据对应即可实现el-table多级表头动态改变表头数据的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [el-table 多级表头动态生成;一级表头,根据数据动态生成,二级固定。](https://blog.csdn.net/weixin_46753476/article/details/131282706)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [el-table多级表头合并表头,设置样式](https://blog.csdn.net/weixin_52618969/article/details/130881560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值