当前位置:首页 > VUE

vue实现多级表格

2026-01-17 03:15:01VUE

Vue 实现多级表格的方法

使用递归组件实现多级表格

递归组件是处理嵌套数据的理想方式,特别适合展示树形结构的数据。

<template>
  <table>
    <thead>
      <tr>
        <th>名称</th>
        <th>值</th>
      </tr>
    </thead>
    <tbody>
      <tree-table :data="tableData"></tree-table>
    </tbody>
  </table>
</template>

<script>
export default {
  components: {
    TreeTable: {
      name: 'TreeTable',
      props: ['data'],
      template: `
        <template v-for="item in data">
          <tr :key="item.id">
            <td>{{ item.name }}</td>
            <td>{{ item.value }}</td>
          </tr>
          <tree-table 
            v-if="item.children && item.children.length"
            :data="item.children"
            :key="'child-' + item.id"
          ></tree-table>
        </template>
      `
    }
  },
  data() {
    return {
      tableData: [
        {
          id: 1,
          name: '一级1',
          value: 100,
          children: [
            {
              id: 2,
              name: '二级1',
              value: 50,
              children: [
                { id: 3, name: '三级1', value: 25 }
              ]
            }
          ]
        }
      ]
    }
  }
}
</script>

使用第三方库实现

对于更复杂的需求,可以考虑使用成熟的表格组件库:

  1. Element UIel-table 支持树形数据展示
  2. Ant Design Vuea-table 提供树形表格功能
  3. VxeTable 专门为 Vue 设计的高级表格组件

以 Element UI 为例:

vue实现多级表格

<template>
  <el-table
    :data="tableData"
    row-key="id"
    border
    default-expand-all
    :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
    <el-table-column prop="name" label="名称"></el-table-column>
    <el-table-column prop="value" label="值"></el-table-column>
  </el-table>
</template>

自定义展开/折叠功能

手动控制行的展开和折叠状态:

<template>
  <table>
    <tbody>
      <tr v-for="item in flattenedData" :key="item.id">
        <td @click="toggleExpand(item)">
          <span v-if="item.children" style="cursor:pointer">
            {{ item.expanded ? '▼' : '▶' }}
          </span>
          {{ item.name }}
        </td>
        <td>{{ item.value }}</td>
      </tr>
    </tbody>
  </table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [...],
      flattenedData: []
    }
  },
  methods: {
    flattenData(data, level = 0, parentExpanded = true) {
      let result = []
      data.forEach(item => {
        const newItem = {...item, level, expanded: false}
        result.push(newItem)
        if (parentExpanded && item.children) {
          result = result.concat(this.flattenData(item.children, level + 1, newItem.expanded))
        }
      })
      return result
    },
    toggleExpand(item) {
      if (item.children) {
        item.expanded = !item.expanded
        this.flattenedData = this.flattenData(this.tableData)
      }
    }
  },
  created() {
    this.flattenedData = this.flattenData(this.tableData)
  }
}
</script>

样式处理

为多级表格添加缩进样式,增强可读性:

vue实现多级表格

tr td:first-child {
  padding-left: calc(var(--level) * 20px);
}

在模板中动态设置层级:

<tr v-for="item in flattenedData" :key="item.id" :style="{'--level': item.level}">

性能优化

对于大型数据集,考虑使用虚拟滚动技术:

<template>
  <virtual-list :size="40" :remain="20">
    <tree-table :data="tableData"></tree-table>
  </virtual-list>
</template>

标签: 表格vue
分享给朋友:

相关文章

vue实现多层评论回复

vue实现多层评论回复

Vue 实现多层评论回复 数据结构设计 多层评论通常采用嵌套结构,每个评论对象包含子评论数组。示例数据结构如下: comments: [ { id: 1, content: '父…

实现.vue文件

实现.vue文件

创建.vue文件的基本结构 一个标准的.vue文件包含三个部分:模板(template)、脚本(script)和样式(style)。这种结构允许开发者在一个文件中管理组件的HTML、JavaScrip…

vue实现driver

vue实现driver

Vue 实现 Driver.js 引导功能 Driver.js 是一个轻量级的 JavaScript 库,用于在网页上创建引导式导览。以下是在 Vue 项目中集成 Driver.js 的详细方法:…

vue实现portal

vue实现portal

Vue 实现 Portal 功能 Portal 是一种将子节点渲染到父组件 DOM 层级之外的 DOM 节点的技术,常用于实现模态框、弹出层等需要脱离当前组件层级的场景。Vue 可以通过多种方式实现…

vue实现监听

vue实现监听

监听数据变化 在Vue中,可以通过watch选项或$watch方法监听数据的变化。watch适用于组件选项内声明式监听,$watch适用于动态监听。 // 选项式API export default…

lua 实现vue

lua 实现vue

在 Lua 中实现类似 Vue 的响应式框架需要模拟 Vue 的核心功能,包括数据绑定、模板渲染和依赖追踪。以下是实现的关键思路和代码示例: 响应式数据绑定 使用 Lua 的 __index 和 _…