当前位置:首页 > VUE

vue实现treetable

2026-03-07 14:28:27VUE

Vue 实现 TreeTable 的方法

使用现成组件库

Element UI、Ant Design Vue 等流行 UI 库都提供了成熟的 TreeTable 组件,可以直接引入使用。

安装 Element UI:

npm install element-ui

基础用法示例:

<template>
  <el-table
    :data="tableData"
    row-key="id"
    default-expand-all
    :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
    <el-table-column prop="date" label="日期"></el-table-column>
    <el-table-column prop="name" label="姓名"></el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [{
        id: 1,
        date: '2016-05-02',
        name: '王小虎',
        children: [{
          id: 11,
          date: '2016-05-01',
          name: '王小明'
        }]
      }]
    }
  }
}
</script>

自定义递归组件实现

如果需要完全自定义的 TreeTable,可以创建递归组件:

  1. 创建 TreeTable 组件:
    
    <template>
    <table>
     <thead>
       <tr>
         <th v-for="col in columns" :key="col.prop">{{ col.label }}</th>
       </tr>
     </thead>
     <tbody>
       <tree-node 
         v-for="node in data"
         :key="node.id"
         :node="node"
         :columns="columns"
         :level="0"
       />
     </tbody>
    </table>
    </template>
import TreeNode from './TreeNode.vue'

export default { components: { TreeNode }, props: { data: Array, columns: Array } }

vue实现treetable

```
  1. 创建 TreeNode 递归组件:
    
    <template>
    <tr :style="{'padding-left': `${level * 20}px`}">
     <td v-for="col in columns" :key="col.prop">
       {{ node[col.prop] }}
     </td>
    </tr>
    <template v-if="node.children && node.children.length">
     <tree-node
       v-for="child in node.children"
       :key="child.id"
       :node="child"
       :columns="columns"
       :level="level + 1"
     />
    </template>
    </template>
export default { name: 'TreeNode', props: { node: Object, columns: Array, level: Number } } ```

使用第三方专用库

vue-treetable 是专门为 Vue 设计的 TreeTable 库:

安装:

npm install vue-treetable

使用示例:

vue实现treetable

<template>
  <treetable
    :data="treeData"
    :columns="columns"
    :options="options"
  />
</template>

<script>
import Treetable from 'vue-treetable'

export default {
  components: { Treetable },
  data() {
    return {
      treeData: [...],
      columns: [
        { label: 'Name', field: 'name' },
        { label: 'Size', field: 'size' }
      ],
      options: {
        showCheckbox: true,
        expandAll: false
      }
    }
  }
}
</script>

实现展开/折叠功能

在自定义实现中添加展开折叠功能:

<template>
  <tr>
    <td @click="toggle">
      <span v-if="hasChildren">{{ isOpen ? '-' : '+' }}</span>
      {{ node.name }}
    </td>
  </tr>
  <tr v-if="isOpen && hasChildren">
    <td :colspan="columns.length">
      <tree-node
        v-for="child in node.children"
        :key="child.id"
        :node="child"
        :columns="columns"
      />
    </td>
  </tr>
</template>

<script>
export default {
  data() {
    return {
      isOpen: false
    }
  },
  computed: {
    hasChildren() {
      return this.node.children && this.node.children.length
    }
  },
  methods: {
    toggle() {
      if (this.hasChildren) {
        this.isOpen = !this.isOpen
      }
    }
  }
}
</script>

性能优化建议

对于大型树形数据,建议:

  • 使用虚拟滚动技术
  • 实现懒加载子节点
  • 避免深层嵌套的响应式数据
  • 对静态数据使用 Object.freeze()

虚拟滚动示例:

<template>
  <virtual-list :size="40" :remain="20">
    <tree-node v-for="item in visibleNodes" :key="item.id" :node="item"/>
  </virtual-list>
</template>

标签: vuetreetable
分享给朋友:

相关文章

vue 实现在线预览

vue 实现在线预览

Vue 实现在线预览的常见方法 使用 iframe 嵌入 通过 iframe 标签可以嵌入多种类型的文件,如 PDF、图片、网页等。需要确保文件地址可访问。 <template> &…

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tabl…

vue实现抽奖

vue实现抽奖

Vue 实现抽奖功能 基本抽奖逻辑 创建一个Vue组件,包含奖品列表、抽奖按钮和结果显示区域。使用随机数生成器选择奖品。 <template> <div> <…

vue 实现跳转

vue 实现跳转

Vue 实现页面跳转的方法 在 Vue 中实现页面跳转通常可以通过以下几种方式实现,具体选择取决于项目需求和技术栈(如是否使用 Vue Router)。 使用 Vue Router 进行编程式导航…

vue实现分站

vue实现分站

Vue 实现分站的方案 在 Vue 中实现分站功能通常涉及路由配置、环境变量管理和动态加载资源。以下是几种常见的实现方式: 基于路由的分站实现 通过 Vue Router 配置多路由,区分不同站点的…

实现vue message

实现vue message

实现 Vue 消息提示组件 创建 Message 组件 在 src/components 目录下创建 Message.vue 文件,内容如下: <template> <tran…