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

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>

实现可交互的树状图

添加展开/折叠功能:

<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
    }
  }
}

在模板中添加加载方法:

利用vue实现树状图

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

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

相关文章

vue路由实现

vue路由实现

Vue 路由实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的基本实现步骤和核心功能。 安装 Vue Router 通过…

vue实现翻译

vue实现翻译

Vue 实现翻译功能的方法 使用 i18n 插件实现多语言切换 安装 vue-i18n 插件: npm install vue-i18n 创建语言资源文件(如 en.json 和 zh.json):…

vue实现骰子

vue实现骰子

Vue 实现骰子功能 创建 Vue 组件 在 Vue 项目中创建一个骰子组件,例如 Dice.vue。该组件包含骰子的外观和逻辑。 <template> <div class=…

vue实现RTMP

vue实现RTMP

Vue 中实现 RTMP 流播放 RTMP(Real-Time Messaging Protocol)是一种用于实时音视频流传输的协议。在 Vue 中实现 RTMP 播放通常需要借助第三方库或播放器。…

vue 实现打印

vue 实现打印

Vue 实现打印功能的方法 在Vue项目中实现打印功能,可以通过以下几种方式实现: 使用window.print()方法 通过调用浏览器的原生打印API实现基础打印功能,适用于简单内容打印。 //…

vue 实现全屏

vue 实现全屏

Vue 实现全屏功能 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 完成。以下是一个完整的实现方案: 安装依赖(可选) 如果需要跨浏览器兼容性更好,可以安装 scre…