当前位置: 首页 > 知识库问答 >
问题:

vue3 - 给定一个结构,如何生成对应的多级表头的表格?

罗鸿福
2024-07-15

给定一个结构,如何生成对应的多级表头的表格?

const fields = [
  {
    label: "A",
    prop: "A"
    sub: [
      {
        label: "A1",
        prop: "A1"
      },
      {
        label: "A2",
        prop: "A2"
      }
    ]
  },
  {
    label: "B",
    prop: "B",
    sub: [
      {
        label: "B1",
        prop: "B1"
      },
      {
        label: "B2",
        prop: "B2"
      }
    ]
  }
]

如果给定的是一个固定层次的嵌套结构,我们可以用两层循环完成。但是当嵌套层次不确定的话,应该怎么递归的生成呢?在vue中该怎么实现?

固定就2层嵌套结构下的实现

<script setup lang="ts">
import { ref, version as vueVersion } from 'vue'
import { version as epVersion } from 'element-plus'
import { ElementPlus } from '@element-plus/icons-vue'

const fields = [
  {
    label: "A",
    prop: "A",
    sub: [
      {
        label: "A1",
        prop: "A1"
      },
      {
        label: "A2",
        prop: "A2"
      }
    ]
  },
  {
    label: "B",
    prop: "B",
    sub: [
      {
        label: "B1",
        prop: "B1"
      },
      {
        label: "B2",
        prop: "B2"
      }
    ]
  }
]

const tableData = [
  { A1: "peter", "A2": "huan", B1: "tom", B2: "li" },
  { A1: "peter", "A2": "huan", B1: "tom", B2: "li" },
  { A1: "peter", "A2": "huan", B1: "tom", B2: "li" },
  { A1: "peter", "A2": "huan", B1: "tom", B2: "li" },
]
</script>

<template>
  <el-table :data="tableData">
    <el-table-column v-for="item in fields" :prop="item.prop" :label="item.label">
      <template v-if="item.sub">
        <el-table-column  v-for="subItem in item.sub" :prop="subItem.prop" :label="subItem.label" >
        </el-table-column>  
      </template>
      
    </el-table-column>
  </el-table>
</template>

共有3个答案

东郭自强
2024-07-15

看看左侧菜单栏是如何处理的,这个和那逻辑是一样的

马德宇
2024-07-15

把你的el-table-column逻辑封装为一个组件,组件内判断有没有sub,有的话递归调用自己

隗轶
2024-07-15

为了递归地生成多级表头的表格,你可以使用递归组件来处理嵌套的fields结构。在Vue中,你可以创建一个组件,该组件接受fields数组作为输入,并根据需要渲染el-table-column和嵌套的el-table-column

以下是一个递归组件的示例,它可以根据给定的嵌套fields结构生成多级表头:

<template>
  <el-table-column
    v-if="!Array.isArray(fields)"
    :prop="fields.prop"
    :label="fields.label"
  />
  <el-table-column
    v-else
    :label="fields[0].label"
  >
    <template v-slot:header>
      <!-- 这里可以添加自定义的表头内容 -->
      <span>{{ fields[0].label }}</span>
    </template>
    <nested-table-header
      v-for="(subField, index) in fields"
      :key="index"
      :fields="subField.sub"
    />
  </el-table-column>
</template>

<script>
export default {
  name: 'NestedTableHeader',
  props: {
    fields: {
      type: [Array, Object],
      required: true,
    },
  },
};
</script>

在你的主组件中,你可以这样使用它:

<template>
  <el-table :data="tableData">
    <nested-table-header
      v-for="(field, index) in fields"
      :key="index"
      :fields="field"
    />
  </el-table>
</template>

<script>
import NestedTableHeader from './NestedTableHeader.vue';

export default {
  components: {
    NestedTableHeader,
  },
  data() {
    return {
      fields: /* ...你的fields结构... */,
      tableData: /* ...你的表格数据... */,
    };
  },
};
</script>

注意,在上面的示例中,NestedTableHeader组件检查传入的fields属性是否是数组。如果是,则递归地渲染嵌套的表头;如果不是,则直接渲染一个el-table-column。这允许你处理任意嵌套级别的表头。

请确保你的Vue版本和Element Plus版本支持上述功能,并根据需要进行调整。

 类似资料:
  • 如何给表格的一行加一个提示? 我给这一行标记为红色,是想说明这一行被标记为删除。但是用户并不知道这个颜色的含义,我想在用户鼠标hover这一行的时候能给出一个提示,这该如何实现?

  • 问题内容: 给定这种表结构,我想弄平多对多关系,并将一个表的“名称”字段中的值转换为列标题,并将同一表中的数量转换为列值。当前可行的想法是将值放入Dictionary(哈希表)中并以代码表示此数据,但我想知道是否存在SQL方式来执行此操作。我还将Linq- to-SQL用于数据访问,因此Linq-to-SQL解决方案将是理想的选择。 [TableA](整数ID) [TableB](整数ID,字符串

  • 二级表头的数据是个数组导致无法直接使用el-table-column进行多级表头,我现在使用表格嵌套,会出现每个单元格里还有个表头,显得很突兀。有没有大佬指点下? 如图: 代码: 想要达到的效果:

  • 只需要用原生的html实现即可, 红框中的内容是动态展示的,而且每次也只会有一条数据

  • 问题内容: 如何在Python中生成一个列表的所有排列,独立于该列表中元素的类型? 例如: 问题答案: 从Python 2.6(如果你使用的是Python 3)开始,你可以使用标准库工具:itertools.permutations。 如果你出于某种原因使用旧版Python(),或者只是想知道它的工作原理,那么这是一种不错的方法,取自 http://code.activestate.com/rec

  • 给定需要排序和分组的对象列表: 我想将列表分组为列表中的列表,按widgetCode分组,每个子列表的元素按照它们在原始列表中遇到的顺序排列。我知道可以使用收集器将它们分组到列表映射中: 我并不认为键是理所当然地排序的,所以我采取了额外的步骤,将整个内容加载到SortedMap类型中: 我知道我可以通过使用.values()从sortedWidgetMap获取集合,而且我猜它是一个有序集合,因为它