当前位置:首页 > VUE

vue实现 treegrid

2026-01-08 00:47:53VUE

Vue 实现 TreeGrid 的方法

使用现成组件库

Element UI、Ant Design Vue 等流行组件库提供了现成的 TreeTable/TreeGrid 组件,可直接使用。

Element UI 示例:

<template>
  <el-table
    :data="tableData"
    style="width: 100%"
    row-key="id"
    border
    lazy
    :load="load"
    :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
    <el-table-column prop="date" label="日期" width="180"></el-table-column>
    <el-table-column prop="name" label="姓名" width="180"></el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [{
        id: 1,
        date: '2016-05-02',
        name: '王小虎',
        hasChildren: true
      }]
    }
  },
  methods: {
    load(tree, treeNode, resolve) {
      setTimeout(() => {
        resolve([
          {
            id: 31,
            date: '2016-05-01',
            name: '王小虎'
          }
        ])
      }, 1000)
    }
  }
}
</script>

自定义递归组件实现

创建递归组件展示树形结构:

<template>
  <table>
    <thead>
      <tr>
        <th>名称</th>
        <th>值</th>
      </tr>
    </thead>
    <tbody>
      <tree-row 
        v-for="item in treeData" 
        :key="item.id" 
        :item="item"
        :level="0"/>
    </tbody>
  </table>
</template>

<script>
import TreeRow from './TreeRow.vue'

export default {
  components: { TreeRow },
  data() {
    return {
      treeData: [
        { id: 1, name: '节点1', value: 100, children: [...] }
      ]
    }
  }
}
</script>

TreeRow.vue 组件:

<template>
  <tr>
    <td :style="{ paddingLeft: level * 20 + 'px' }">
      {{ item.name }}
    </td>
    <td>{{ item.value }}</td>
  </tr>
  <tree-row 
    v-if="item.children"
    v-for="child in item.children"
    :key="child.id"
    :item="child"
    :level="level + 1"/>
</template>

<script>
export default {
  name: 'TreeRow',
  props: {
    item: Object,
    level: Number
  }
}
</script>

使用第三方 TreeGrid 库

vue-table-with-tree-grid 是专为 Vue 设计的树形表格组件:

安装:

npm install vue-table-with-tree-grid

使用示例:

<template>
  <tree-table 
    :data="data" 
    :columns="columns" 
    border>
  </tree-table>
</template>

<script>
import TreeTable from 'vue-table-with-tree-grid'

export default {
  components: { TreeTable },
  data() {
    return {
      data: [
        { id: 1, name: '父节点', children: [...] }
      ],
      columns: [
        { label: 'ID', prop: 'id' },
        { label: '名称', prop: 'name' }
      ]
    }
  }
}
</script>

实现关键功能

展开/折叠功能可通过维护 expandedIds 状态实现:

data() {
  return {
    expandedIds: new Set()
  }
},
methods: {
  toggleExpand(id) {
    if (this.expandedIds.has(id)) {
      this.expandedIds.delete(id)
    } else {
      this.expandedIds.add(id)
    }
  }
}

性能优化建议

大数据量时考虑虚拟滚动技术,可使用 vue-virtual-scroller 等库实现:

<template>
  <RecycleScroller
    :items="flattenedData"
    :item-size="50"
    key-field="id">
    <template v-slot="{ item }">
      <div :style="{ paddingLeft: item.level * 20 + 'px' }">
        {{ item.name }}
      </div>
    </template>
  </RecycleScroller>
</template>

vue实现 treegrid

标签: vuetreegrid
分享给朋友:

相关文章

vue怎么实现文件树

vue怎么实现文件树

Vue 实现文件树的方法 使用递归组件 递归组件是处理嵌套数据结构的理想方式。文件树通常包含文件夹和文件的嵌套结构,适合用递归组件实现。 <template> <ul>…

vue穿梭框组件实现

vue穿梭框组件实现

实现基础穿梭框组件 在Vue中实现穿梭框组件,可以使用<el-transfer>(Element UI)或手动实现。以下是手动实现的核心逻辑: <template> &…

vue中实现显示和隐藏

vue中实现显示和隐藏

控制显示与隐藏的方法 在Vue中实现元素的显示和隐藏可以通过多种方式完成,以下是常见的几种方法: 1. 使用v-if指令v-if根据条件动态添加或移除DOM元素,适合需要频繁切换的场景。当条件为fa…

vue实现付款

vue实现付款

Vue 实现付款功能 在 Vue 中实现付款功能通常需要集成第三方支付网关(如支付宝、微信支付、Stripe 等)。以下是常见的实现方法: 集成支付宝/微信支付 安装必要的依赖(如 axios 用…

实现 vue ssr

实现 vue ssr

Vue SSR 实现方法 Vue SSR(Server-Side Rendering)通过服务器端渲染 Vue 应用,提升首屏加载速度和 SEO 友好性。以下是核心实现方法: 基础配置 安装必要…

vue实现autocomplete

vue实现autocomplete

Vue 实现 Autocomplete 功能 Vue 中实现 Autocomplete(自动完成)功能可以通过自定义组件或使用现有库完成。以下是几种常见方法: 方法一:使用 Vue 原生实现 创建…