当前位置:首页 > VUE

vue实现tree-grid

2026-01-23 15:37:11VUE

实现 Tree-Grid 的基本思路

在 Vue 中实现 Tree-Grid(树形表格)通常需要结合树形结构和表格布局的功能。可以通过递归组件或第三方库来实现。

使用递归组件实现

递归组件是 Vue 中实现树形结构的常见方式。通过组件调用自身,可以动态渲染嵌套的树形数据。

<template>
  <table>
    <thead>
      <tr>
        <th v-for="column in columns" :key="column.key">{{ column.title }}</th>
      </tr>
    </thead>
    <tbody>
      <tree-grid-row
        v-for="item in data"
        :key="item.id"
        :item="item"
        :columns="columns"
        :children-field="childrenField"
      />
    </tbody>
  </table>
</template>

<script>
import TreeGridRow from './TreeGridRow.vue';

export default {
  name: 'TreeGrid',
  components: { TreeGridRow },
  props: {
    data: { type: Array, required: true },
    columns: { type: Array, required: true },
    childrenField: { type: String, default: 'children' },
  },
};
</script>

TreeGridRow 组件中实现递归渲染:

<template>
  <tr>
    <td v-for="column in columns" :key="column.key">
      {{ item[column.key] }}
    </td>
  </tr>
  <template v-if="item[childrenField] && item[childrenField].length">
    <tree-grid-row
      v-for="child in item[childrenField]"
      :key="child.id"
      :item="child"
      :columns="columns"
      :children-field="childrenField"
    />
  </template>
</template>

<script>
export default {
  name: 'TreeGridRow',
  props: {
    item: { type: Object, required: true },
    columns: { type: Array, required: true },
    childrenField: { type: String, default: 'children' },
  },
};
</script>

使用第三方库

如果不想手动实现,可以使用成熟的第三方库,例如:

  • vue-table-with-tree-grid:专为 Vue 设计的树形表格组件。
  • element-uiel-table:通过 row-keytree-props 支持树形结构。

element-ui 为例:

<template>
  <el-table
    :data="data"
    row-key="id"
    :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
  >
    <el-table-column prop="name" label="Name" width="180" />
    <el-table-column prop="value" label="Value" />
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      data: [
        {
          id: 1,
          name: 'Parent',
          value: 'Parent Value',
          children: [
            { id: 2, name: 'Child', value: 'Child Value' },
          ],
        },
      ],
    };
  },
};
</script>

添加展开/折叠功能

在手动实现的递归组件中,可以通过 v-ifv-show 控制子节点的显示与隐藏:

<template>
  <tr>
    <td>
      <button @click="toggle">
        {{ isExpanded ? '−' : '+' }}
      </button>
      {{ item.name }}
    </td>
    <td>{{ item.value }}</td>
  </tr>
  <tr v-if="isExpanded && item.children">
    <td colspan="2">
      <table>
        <tree-grid-row
          v-for="child in item.children"
          :key="child.id"
          :item="child"
        />
      </table>
    </td>
  </tr>
</template>

<script>
export default {
  name: 'TreeGridRow',
  props: {
    item: { type: Object, required: true },
  },
  data() {
    return {
      isExpanded: false,
    };
  },
  methods: {
    toggle() {
      this.isExpanded = !this.isExpanded;
    },
  },
};
</script>

样式优化

为树形表格添加缩进效果,可以通过 CSS 控制:

.tree-grid-row td:first-child {
  padding-left: calc(var(--level) * 20px);
}

在组件中动态绑定缩进层级:

<tr :style="`--level: ${level}`">
  <!-- ... -->
</tr>

通过以上方法,可以实现一个功能完整的 Tree-Grid 组件。

vue实现tree-grid

标签: vuetree
分享给朋友:

相关文章

vue 实现toast

vue 实现toast

vue 实现 toast 的方法 在 Vue 中实现 Toast 提示功能可以通过多种方式,以下是几种常见的实现方法: 使用第三方库 Vue 生态中有许多成熟的 Toast 库,例如 vue-toa…

vue 方法实现

vue 方法实现

在 Vue 中,方法的实现通常通过 methods 选项完成。以下是 Vue 方法实现的核心要点和示例: 基本方法定义 在 Vue 组件中定义方法时,需将函数声明放在 methods 对象内。这些…

vue vnode实现

vue vnode实现

Vue VNode 实现原理 VNode(Virtual Node)是 Vue 的核心概念之一,用于描述真实 DOM 的轻量级虚拟表示。VNode 的实现涉及以下关键点: VNode 的基本结构…

vue实现hovuer

vue实现hovuer

Vue 实现 Hover 效果 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 直接控制 通过 :hover 伪类实现,无需额外的 JavaScrip…

vue实现通讯

vue实现通讯

Vue 组件通讯方法 父子组件通讯 父组件向子组件传递数据通过 props,子组件向父组件传递数据通过 $emit 事件。 父组件模板: <child-component :message=…

vue实现单击

vue实现单击

Vue 实现单击事件的方法 在 Vue 中实现单击事件可以通过 v-on 指令或简写的 @ 符号绑定事件处理器。以下是几种常见的实现方式: 基础用法 通过 v-on:click 或 @click 绑…