当前位置:首页 > 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 多级弹窗实现方法 方法一:使用动态组件与递归组件 在 Vue 中可以通过动态组件配合递归组件实现多级弹窗。定义一个基础弹窗组件,通过递归调用自身实现层级嵌套。 基础弹窗组件模板示例: &…

jquery实现vue

jquery实现vue

jQuery 和 Vue.js 是两种不同理念的前端工具,jQuery 以 DOM 操作和事件驱动为核心,而 Vue.js 是数据驱动的现代化框架。如果想用 jQuery 实现类似 Vue 的功能(如…

vue 实现回复

vue 实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及表单提交、数据绑定和列表渲染。以下是实现步骤和代码示例: 数据绑定与表单 <template> <div>…

vue 动画实现

vue 动画实现

Vue 动画实现方式 Vue 提供了多种方式实现动画效果,主要分为内置组件和第三方库集成。 使用 Vue 内置过渡组件 Vue 的 <transition> 和 <transiti…

vue 实现登录

vue 实现登录

Vue 实现登录功能 创建登录表单组件 在 Vue 项目中创建一个登录表单组件(如 Login.vue),包含用户名和密码输入框以及提交按钮。使用 v-model 实现双向数据绑定。 <tem…

vue网页实现

vue网页实现

Vue 网页实现指南 环境准备 安装 Node.js 和 npm/yarn,确保环境配置正确。使用 Vue CLI 或 Vite 创建项目框架,快速搭建开发环境。 npm install -g @v…