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

vue实现 treegrid

<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

前端多线程实现vue

前端多线程与Vue的结合 在Vue中实现多线程通常通过Web Worker技术完成。Web Worker允许在后台线程中运行脚本,避免阻塞主线程,适合处理计算密集型任务。 使用Web Worker的…

vue实现钟表

vue实现钟表

使用 Vue 实现动态钟表 以下是一个基于 Vue 3 的动态钟表实现方案,包含时分秒指针和数字时间显示。 模板部分 <template> <div class="cloc…

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

vue实现评价

vue实现评价

Vue实现评价功能 数据绑定与双向绑定 Vue的核心特性是数据绑定和双向绑定,通过v-model指令可以轻松实现表单输入与应用状态之间的双向绑定。在评价功能中,可以使用v-model绑定评论文本和评分…

vue 实现模态框

vue 实现模态框

Vue 实现模态框的方法 使用组件化方式创建模态框 在 Vue 中,可以通过组件化方式创建一个可复用的模态框组件。以下是一个简单的实现示例: <template> <div c…

vue实现全选

vue实现全选

Vue 实现全选功能 全选功能通常用于表格或列表中,允许用户一键选择所有项目。以下是几种实现方式: 使用 v-model 和计算属性 在数据中维护一个数组存储选中项的 ID,通过计算属性实现全选逻辑…