当前位置:首页 > 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实现anchor

vue实现anchor

Vue 实现 Anchor(锚点)功能 在 Vue 中实现锚点功能可以通过多种方式完成,以下是几种常见的方法: 使用 HTML 原生锚点 HTML 原生锚点是最简单的方式,通过 <a>…

vue前端实现登录

vue前端实现登录

实现登录功能的基本流程 使用Vue实现登录功能需要结合前端框架和后端API交互。以下是一个典型的实现方案: 安装必要依赖 确保项目已安装axios用于HTTP请求: npm install axi…

vue单页面实现登录

vue单页面实现登录

实现登录功能的基本流程 在Vue单页面应用中实现登录功能,通常需要以下几个关键步骤: 创建登录表单组件 使用Vue的模板语法创建包含用户名和密码输入框的表单,并绑定数据到组件的data属性。 <…

vue实现点击页面切换

vue实现点击页面切换

实现点击页面切换功能 在Vue中实现点击页面切换功能,可以通过路由跳转或组件动态渲染两种方式完成。以下是具体实现方法: 使用Vue Router实现页面跳转 安装Vue Router后,在项目中…

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成…

vue实现收起展开面板

vue实现收起展开面板

实现收起展开面板的方法 在Vue中实现收起展开面板功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-show或v-if控制显示隐藏 利用Vue的指令可以轻松实现面板的展开和收起:…