基于Element组件下动态生成多级表头以及数据

本文介绍基于Vue的Element组件,重点讲解如何根据后端传输数据动态生成表格。在代码部分,利用Vue循环生成表头,用if语句判断二级表头;JS获取表头和内容并添加对应key。最后假定了后端数据格式,欢迎交流指正。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

element是一套基于vue的组件,本文主要介绍如何根据后端传输数据来动态生成表格。

代码

html

利用vue里的for循环来动态生成表头,再利用if语句判断是否有二级表头,并将对应key赋值给labelprop

<template id="table">
    <el-table :data="tableData" :stripe=true :border=true  height="80%"  class="tablehead">
      <!-- for循环 
      判断是否含有子类
      -->
      <el-table-column v-for="key in listhead" v-if="key[Object.keys(key)]!=null" :label="Object.keys(key).toString()"
        :prop="Object.keys(key).toString()">
        <el-table-column v-for="keychild in key[Object.keys(key)]" :label="keychild"
          :prop="keychild" sortable>
        </el-table-column>
      </el-table-column>
      <el-table-column v-else :label="Object.keys(key).toString()" :prop="Object.keys(key).toString()" sortable>
      </el-table-column>
    </el-table>
  </template>

js

先获取表头和表格内容,将表格内容push到数组并添加对应的key方便使用

 var listhead = test[0]; //获取表头
    var listbody = test[1]; //获取内容
    listhead = eval(listhead);
    //创建表格内容的数组
    var listbodyarr = [];
    for (i in listbody) {
      console.log(listbody[i][0])
     listbodyarr.push({
          '商品号': listbody[i][0],
          'a_1': listbody[i][1],
          'a_2': listbody[i][2],
          'a_3': listbody[i][3],
          'a_4': listbody[i][4],
          'b_1': listbody[i][5],
          'b_2': listbody[i][6],
          'b_3': listbody[i][7],
          'b_4': listbody[i][8],
          'C': listbody[i][9],
          'D': listbody[i][10],
          'E': listbody[i][11],
        });
    }
    new Vue({
      el: '#table',
      data: function () {
        return {
          tableData: listbodyarr,//表格内容
          listhead: listhead,//表头
        }

      }
    })

后端数据

假定后端数据如下展示格式

 var test = [
      [{
          "商品号": null
        },
        {
          " A": ["a_1", "a_2", "a_3", "a_4"]
        },
        {
          "B": ["b_1", "b_2", "b_3", "b_4"]
        },
        {
          "C": null
        },
        {
          "D": null
        },
        {
          "E": null
        }
      ],
      [
        ["1234", 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 0],
        ["12345", 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0],
        ["23123", 6, 1, 2, 9, 3, 0, 7, 10, 2, 0, 0],
        ["P123", 2, 1, 1, 4, 0, 0, 1, 1, 1, 0, 0],
        ["43244", 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 0],
        ["fsdf3", 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0],
        ["134324", 6, 1, 2, 9, 3, 0, 7, 10, 2, 0, 0],
        ["fsdf3", 2, 1, 1, 4, 0, 0, 1, 1, 1, 0, 0],
        ["3452", 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 0],
        ["1026", 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0],
        ["7527", 6, 1, 2, 9, 3, 0, 7, 10, 2, 0, 0],
        ["7788", 2, 1, 1, 4, 0, 0, 1, 1, 1, 0, 0],
        ["0yly", 0, 4, 0, 4, 0, 4, 0, 4, 0, 0, 0],
        ["wuhu", 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0],
        ["saber1", 6, 1, 2, 9, 3, 0, 7, 10, 2, 0, 0],
        ["23344", 2, 1, 1, 4, 0, 0, 1, 1, 1, 0, 0],
      ]
    ]

结语

Element是一个功能强大的组件,如有更好的方法、疑问或者错误之处欢迎大家指正。对不同格式数据的处理问题也可以私聊或者在评论区讨论。

Vue与Element UI结合使用时,可以通过递归组件来实现动态生成多级表头。递归组件是指组件自身调用自身,这种模式在处理具有层级结构的数据时非常有用,例如,多级表头、树形控件等。 要实现动态生成多级表头,首先需要在Vue组件中定义一个递归组件,该组件能够根据传入的表头数据(通常是一个数组,其中每个元素可能包含子表头信息)进行渲染。在Element UI中,可以使用`el-table`的`header slot`来自定义表头,然后在递归组件中递归地渲染每一级表头。 以下是一个简化的示例: ```html <template> <el-table :header-rows="headerRows"> <!-- 自定义表头 --> <template #header="scope"> <my-header-row v-for="row in scope.rowspan" :key="row.index" :row="row" @row-click="handleHeaderClick" ></my-header-row> </template> <!-- 表格其他部分 --> <!-- ... --> </el-table> </template> <script> import MyHeaderRow from './MyHeaderRow.vue'; // 假设已经定义了名为MyHeaderRow的递归组件 export default { components: { MyHeaderRow }, data() { return { // 表头数据,每个表头元素可以包含子表头信息 headers: [ { label: '一级表头', children: [ { label: '二级表头1', children: [ { label: '三级表头1-1' }, { label: '三级表头1-2' } ] }, { label: '二级表头2', children: [ { label: '三级表头2-1' } ] } ] } ] }; }, computed: { // 计算属性,用于将表头数据转换为Element UI表格所需的格式 headerRows() { return this.transformHeaders(this.headers); } }, methods: { // 递归转换表头数据的函数 transformHeaders(headers, depth = 0) { return headers.map((header) => { const rowspan = depth === 0 ? 1 : (this.countChildren(header.children) || 1); return { rowspan, colspan: 1, ...header }; }).concat( headers.some(header => header.children && header.children.length > 0) ? this.transformHeaders(headers.flatMap(header => header.children), depth + 1) : [] ); }, // 计算子表头数量的辅助函数 countChildren(children) { return children.reduce((total, child) => total + (child.children ? this.countChildren(child.children) : 1), 0); }, handleHeaderClick(row) { // 处理表头点击事件 } } }; </script> ``` 在这个示例中,`MyHeaderRow`是递归组件,它根据传入的表头信息(`row`)进行渲染,并且可以响应点击事件。`transformHeaders`函数用于将多级表头数据转换成表格所需的格式,它递归地计算每一级表头的`rowspan`。`countChildren`函数用于计算每个表头项下有多少子表头,以便正确设置`rowspan`。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值