当前位置:首页 > VUE

利用vue实现树状图

2026-02-21 04:32:53VUE

Vue实现树状图的方法

使用递归组件实现树状结构

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

<template>
  <div>
    <tree-node :node="treeData"></tree-node>
  </div>
</template>

<script>
export default {
  components: {
    TreeNode: {
      name: 'TreeNode',
      props: ['node'],
      template: `
        <div>
          <div>{{ node.name }}</div>
          <div v-if="node.children" style="margin-left: 20px">
            <tree-node 
              v-for="child in node.children" 
              :key="child.id" 
              :node="child">
            </tree-node>
          </div>
        </div>
      `
    }
  },
  data() {
    return {
      treeData: {
        id: 1,
        name: 'Root',
        children: [
          {
            id: 2,
            name: 'Child 1',
            children: [
              { id: 4, name: 'Grandchild 1' },
              { id: 5, name: 'Grandchild 2' }
            ]
          },
          {
            id: 3,
            name: 'Child 2'
          }
        ]
      }
    }
  }
}
</script>

使用第三方库实现高级树状图

对于更复杂的需求,可以使用专门的树状图组件库如vue-tree-chartvuejs-tree

安装vue-tree-chart:

利用vue实现树状图

npm install vue-tree-chart

示例代码:

<template>
  <div>
    <tree-chart :data="treeData"></tree-chart>
  </div>
</template>

<script>
import TreeChart from 'vue-tree-chart'

export default {
  components: { TreeChart },
  data() {
    return {
      treeData: {
        name: 'Root',
        children: [
          {
            name: 'Child 1',
            children: [
              { name: 'Grandchild 1' },
              { name: 'Grandchild 2' }
            ]
          },
          {
            name: 'Child 2'
          }
        ]
      }
    }
  }
}
</script>

实现可交互的树状图

添加展开/折叠功能:

利用vue实现树状图

<template>
  <div>
    <tree-node :node="treeData"></tree-node>
  </div>
</template>

<script>
export default {
  components: {
    TreeNode: {
      name: 'TreeNode',
      props: ['node'],
      data() {
        return {
          isExpanded: true
        }
      },
      template: `
        <div>
          <div @click="isExpanded = !isExpanded">
            {{ node.name }} 
            <span v-if="node.children">
              {{ isExpanded ? '[-]' : '[+]' }}
            </span>
          </div>
          <div 
            v-if="node.children && isExpanded" 
            style="margin-left: 20px">
            <tree-node 
              v-for="child in node.children" 
              :key="child.id" 
              :node="child">
            </tree-node>
          </div>
        </div>
      `
    }
  },
  data() {
    return {
      treeData: {
        id: 1,
        name: 'Root',
        children: [
          {
            id: 2,
            name: 'Child 1',
            children: [
              { id: 4, name: 'Grandchild 1' },
              { id: 5, name: 'Grandchild 2' }
            ]
          },
          {
            id: 3,
            name: 'Child 2'
          }
        ]
      }
    }
  }
}
</script>

添加样式美化树状图

通过CSS增强视觉效果:

.tree-node {
  margin: 5px 0;
  cursor: pointer;
}

.tree-node-name {
  padding: 5px;
  background: #f5f5f5;
  border-radius: 3px;
  display: inline-block;
}

.tree-node-name:hover {
  background: #e0e0e0;
}

.tree-children {
  margin-left: 20px;
  border-left: 1px dashed #ccc;
  padding-left: 10px;
}

动态加载树状数据

实现异步加载子节点:

methods: {
  async loadChildren(node) {
    if (!node.childrenLoaded && node.hasChildren) {
      const response = await fetch(`/api/nodes/${node.id}/children`)
      node.children = await response.json()
      node.childrenLoaded = true
    }
  }
}

在模板中添加加载方法:

<div @click="loadChildren(node); isExpanded = !isExpanded">
  {{ node.name }}
</div>

标签: 树状vue
分享给朋友:

相关文章

vue实现方法

vue实现方法

Vue 实现方法 Vue 是一种流行的前端框架,用于构建用户界面和单页应用。以下是几种常见的 Vue 实现方法: 创建 Vue 实例 通过 new Vue() 创建一个 Vue 实例,传入配置对象,…

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生改…

vue实现oauth

vue实现oauth

Vue 实现 OAuth 的步骤 安装必要的依赖 确保项目中安装了 axios 和 vue-router。OAuth 通常需要发送 HTTP 请求和处理路由跳转。 npm install axios…

vue实现发帖

vue实现发帖

使用 Vue 实现发帖功能 前端实现 创建发帖表单组件,包含标题和内容输入框,以及提交按钮。使用 v-model 绑定表单数据。 <template> <div>…

vue实现api

vue实现api

Vue 实现 API 调用 在 Vue 中调用 API 通常涉及使用 axios 或 fetch 发送 HTTP 请求,并结合 Vue 的响应式特性管理数据。以下是常见的实现方式: 安装 axios…

vue广播实现

vue广播实现

vue广播实现 在Vue中实现广播功能可以通过事件总线(Event Bus)或Vuex来完成。以下是两种常见的实现方式: 使用事件总线(Event Bus) 事件总线是一种简单的跨组件通信方式,适用…