【JSON渲染工具】Element UI动态生成表格,多行表头,自定义表头合并

【JSON渲染工具】Element UI动态生成表格,多行表头,自定义表头合并

一、JSON数据

  • table:中每个对象代表一张表格;
  • table_header:表示表格表头数据;
    • headerColor:表示表格表头背景颜色;
    • headerData:表示表格表头内容数据;
      • prop:值为与table_content中对象属性对应,data_list中的avgMen对应的prop需为"first.avgMen"(这里跟获取对象的点语法相似),如以下例子
      • label:值为表头文案
      • width:为列宽度
      • minWidrh:为列最小宽度
      • fixed:列左浮动或右浮动(值为left或right)
      • showOverflowTooltip:表示文案超过列宽度则内容不换行显示…,鼠标悬停显示全部文案弹框
      • children:表示合并表头
  • table_content:表示表格内容数据;
  • 如若有多张表格则在table中继续添加对象即可;
let table = [
  {
    table_content: [
      {
        device_id: "1613",
        device_name: "VIVO",
        device_level: "高",
        data_list: [
          {
            scene_name: "场景操作1",
            first: {
              //first对象表示第一轮测试
              a: 6,
              b: 3.1,
              c: 1
            },
            secend: {
              //secend对象表示第二轮测试
              a: 6,
              b: 3.1,
              c: 1
            },

            avg: {
              //avg对象表示平均数据
              a: 6,
              b: 3.1,
              c: 1
            }
          },
          {
            scene_name: "场景操作2",
            first: {
              a: 6,
              b: 3.1,
              c: 1
            },
            secend: {
              a: 6,
              b: 3.1,
              c: 1
            },

            avg: {
              a: 0.61,
              b: 4444,
              c: 1
            }
          },
          //这里的控制用与显示空行
          {
            scene_name: "",
            first: {
              a: "",
              b: "",
              c: ""
            },
            secend: {
              a: "",
              b: "",
              c: ""
            },

            avg: {
              a: "",
              b: "",
              c: ""
            }
          },
          {
            type: "diff", ///这里的diff需要加的话都可以加
            scene_name: "场景操作2",
            first: {
              a: 6,
              b: 3.1,
              c: 1
            },
            secend: {
              a: 6,
              b: 3.1,
              c: 1
            },

            avg: {
              a: 6,
              b: 3.1,
              c: 1
            }
          },
          {
            scene_name: "场景操作2",
            first: {
              a: 6,
              b: 3.1,
              c: 1
            },
            secend: {
              a: 6,
              b: 3.1,
              c: 1
            },

            avg: {
              a: 6,
              b: 3.1,
              c: 1
            }
          }
        ]
      },
      {
        device_id: "1318",
        device_name: "iPhone SE 2",
        device_level: "中",
        data_list: [
          {
            scene_name: "场景操作1",
            first: {
              //first对象表示第一轮测试
              a: 6,
              b: 3.1,
              c: 1
            },
            secend: {
              //secend对象表示第二轮测试
              a: 6,
              b: 3.1,
              c: 1
            },

            avg: {
              //avg对象表示平均数据
              a: 6,
              b: 3.1,
              c: 1
            }
          },
          {
            scene_name: "场景操作2",
            first: {
              a: 6,
              b: 3.1,
              c: 1
            },
            secend: {
              a: 6,
              b: 3.1,
              c: 1
            },

            avg: {
              a: 0.61,
              b: 4444,
              c: 1,
              avgFps: 1,
              jank: 1,
              bigJank: 1,
              drop: 1,
              temp: 1
            }
          },
          //这里的控制用与显示空行
          {
            scene_name: "",
            first: {
              a: "",
              b: "",
              c: ""
            },
            secend: {
              a: "",
              b: "",
              c: ""
            },

            avg: {
              a: "",
              b: "",
              c: ""
            }
          },
          {
            type: "diff",
            scene_name: "场景操作2",
            first: {
              a: 6,
              b: 3.1,
              c: 1
            },
            secend: {
              a: 6,
              b: 3.1,
              c: 1
            },

            avg: {
              a: 6,
              b: 3.1,
              c: 1
            }
          },
          {
            scene_name: "场景操作2",
            first: {
              a: 6,
              b: 3.1,
              c: 1
            },
            secend: {
              a: 6,
              b: 3.1,
              c: 1
            },

            avg: {
              a: 6,
              b: 3.1,
              c: 1
            }
          }
        ]
      }
    ],
    table_header: {
      headerColor: "#F5F7FA",
      headerData: [
        {
          prop: "device_id",
          label: "设备ID",
          index: 2,
          minWidth: 90,
          fixed: "left"
        },
        {
          label: "设备名称",
          index: 2,
          prop: "device_name",
          minWidth: 100,
          showOverflowTooltip: true
        },
        {
          label: "设备档位",
          index: 2,
          prop: "device_level",
          minWidth: 90
        },
        {
          label: "场景操作",
          prop: "scene_name",
          minWidth: 250,
          showOverflowTooltip: true
        },
        {
          //第一论测试对应data_list中的first
          label: "第一论测试",
          prop: "first", //这里的prop值需对应data_list中第几轮的属性值即data_list中first对象为第第一轮测试,那么这里prop值就为first,如果上面的data_list中第一轮测试为first1对,这里的prop值就为first1
          children: [
            {
              //这里的first.a是指获取data_list中first的内存均值(first.a是对象获取值的方法(点语法))
              prop: "first.a",
              label: "内存均值",
              minWidth: 73
            },
            {
              //这里的first.b是指获取data_list中first的内存峰值
              prop: "first.b",
              label: "内存峰值",
              minWidth: 73
            },
            {
              prop: "first.c",
              label: "CPU均值",
              minWidth: 75
            }
          ]
        },
        {
          //第二论测试对应data_list中的secend
          label: "第二论测试",
          prop: "secend", //这里的prop值需对应data_list中第几轮的属性值即data_list中secend对象为第二轮测试,那么这里prop值就为secend,如果上面的data_list中第二轮测试为secend1对,这里的prop值就为secend1
          children: [
            {
              //这里的secend.a是指获取data_list中secend的内存均值(secend.a是对象获取值的方法(点语法))
              prop: "secend.a",
              label: "内存均值",
              minWidth: 73
            },
            {
              //这里的secend.b是指获取data_list中secend的内存峰值(secend.b是对象获取值的方法(点语法)),以此类推
              prop: "secend.b",
              label: "内存峰值",
              minWidth: 73
            },
            {
              prop: "secend.c",
              label: "CPU均值"
            }
          ]
        },

        {
          label: "平均数据",
          prop: "avg",
          children: [
            {
              prop: "avg.a",
              label: "内存均值",
              minWidth: 73
            },
            {
              prop: "avg.b",
              label: "内存峰值",
              minWidth: 73
            },
            {
              prop: "avg.c",
              label: "CPU均值",
              minWidth: 75
            }
          ]
        }
      ]
    }
  }
]

二、表格渲染结果

在这里插入图片描述

三、页面代码暂无,仅为el-table的渲染数据格式

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过动态生成表头的方式来实现根据后端返回数据动态渲染多级表头,具体的实现步骤如下: 1. 获取后端返回的表头数据,可以通过 API 接口获取。 2. 遍历表头数据,生成对应的列对象。可以使用 Element UI 表格组件中的 column 属性来实现。 3. 如果当前列对象有子列,那么递归生成子列对象。 4. 将生成的列对象数组作为表格组件的 columns 属性进行渲染。 以下是一个示例代码: ```vue <template> <el-table :data="tableData" :columns="tableColumns" border ></el-table> </template> <script> export default { data() { return { tableData: [], tableColumns: [], }; }, methods: { // 获取后端返回的表头数据 async fetchTableHeader() { const res = await fetch('/api/table/header'); const headerData = await res.json(); this.tableColumns = this.generateColumns(headerData); }, // 递归生成列对象 generateColumns(headerData) { return headerData.map((item) => { const column = { label: item.label, prop: item.prop, }; if (item.children && item.children.length) { column.children = this.generateColumns(item.children); } return column; }); }, // 获取后端返回的表格数据 async fetchTableData() { const res = await fetch('/api/table/data'); this.tableData = await res.json(); }, }, mounted() { this.fetchTableHeader(); this.fetchTableData(); }, }; </script> ``` 在这个示例代码中,通过 fetchTableHeader 方法获取后端返回的表头数据,并使用 generateColumns 方法生成对应的列对象,如果当前列对象有子列,那么会递归生成子列对象。最后将生成的列对象数组作为表格组件的 columns 属性进行渲染。 需要注意的是,由于表格数据是异步获取的,因此需要在获取表头数据和表格数据之后再进行渲染。在这个示例代码中,通过 mounted 钩子函数来依次调用 fetchTableHeader 和 fetchTableData 方法获取数据,并在获取数据完成后渲染表格组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值