当前位置:首页 > 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);
}

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

vue实现tree-grid

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

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

标签: vuetree
分享给朋友:

相关文章

vue实现分屏

vue实现分屏

Vue 实现分屏的方法 分屏功能通常用于展示多个独立内容区域,以下是几种常见的实现方式: 使用 CSS Grid 布局 通过 CSS Grid 可以轻松创建分屏布局,在 Vue 组件中直接应用样式:…

vue实现图册

vue实现图册

Vue实现图册功能 在Vue中实现图册功能通常涉及图片展示、切换、缩放等交互效果。以下是常见的实现方法和关键代码示例: 基础图册组件结构 使用Vue单文件组件构建基础结构: <templat…

vue 实现图钉

vue 实现图钉

实现图钉效果的步骤 在Vue中实现图钉(固定位置)效果,可以通过CSS的position: sticky属性或监听滚动事件动态修改元素样式。以下是两种常见方法: 方法一:使用CSS的position…

vue导航实现

vue导航实现

Vue 导航实现方法 在 Vue 中实现导航功能通常涉及路由配置、组件设计和状态管理。以下是几种常见的实现方式: 使用 Vue Router 实现基础导航 安装 Vue Router: npm i…

vue实现checkbox

vue实现checkbox

Vue 实现 Checkbox 在 Vue 中实现 Checkbox 可以通过原生 HTML 的 <input type="checkbox"> 或使用 Vue 的 v-model 指令绑…

vue实现word文档

vue实现word文档

Vue 实现 Word 文档功能 在 Vue 项目中实现 Word 文档的生成、预览或编辑功能,通常需要借助第三方库或服务。以下是几种常见的实现方式: 使用 docx 库生成 Word 文档 安装…