当前位置:首页 > 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 组件:

vue实现 treegrid

<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 设计的树形表格组件:

安装:

vue实现 treegrid

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>

标签: vuetreegrid
分享给朋友:

相关文章

vue 实现blog

vue 实现blog

Vue 实现博客的基本步骤 使用 Vue 实现博客可以分为前端和后端两部分,前端使用 Vue.js 框架,后端可以选择 Node.js、Python 或其他服务端语言。以下是一个基于 Vue 的博客实…

vue实现mouseout

vue实现mouseout

Vue 实现 mouseout 事件的方法 在 Vue 中实现 mouseout 事件可以通过多种方式完成,以下是几种常见的方法: 使用 v-on 指令 Vue 提供了 v-on 指令(或简写为 @…

vue实现tab

vue实现tab

Vue 实现 Tab 切换功能 在 Vue 中实现 Tab 切换功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-if 和 v-show 指令 通过绑定 v-if 或 v-show 来…

vue实现多线程

vue实现多线程

Vue.js 本身是单线程框架,但可以通过以下方法实现类似多线程的效果或利用浏览器多线程能力: 使用 Web Worker Web Worker 是浏览器提供的多线程 API,适合处理 CPU 密集…

vue 实现点击选中

vue 实现点击选中

实现点击选中效果 在Vue中实现点击选中效果可以通过多种方式完成,以下是几种常见的方法: 方法一:使用v-bind和v-on 通过绑定class和监听click事件来实现选中状态切换。 <…

vue实现添加div

vue实现添加div

在 Vue 中动态添加 div 元素 使用 v-for 指令动态渲染 div 通过 v-for 可以基于数组数据动态生成多个 div 元素。在模板中绑定数组数据,Vue 会自动遍历数组并为每个元素创建…