当前位置:首页 > VUE

实现树形菜单vue

2026-02-17 20:26:00VUE

使用递归组件实现树形菜单

在Vue中实现树形菜单最常用的方法是使用递归组件。递归组件是指组件在其模板中调用自身,这种模式非常适合展示嵌套的树形数据结构。

创建树形菜单组件TreeMenu.vue:

<template>
  <ul>
    <li v-for="item in treeData" :key="item.id">
      {{ item.name }}
      <TreeMenu v-if="item.children" :treeData="item.children"/>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeMenu',
  props: {
    treeData: {
      type: Array,
      required: true
    }
  }
}
</script>

准备树形数据结构

树形菜单需要特定的数据结构支持,通常是一个包含嵌套children的数组对象。示例数据结构如下:

实现树形菜单vue

const treeData = [
  {
    id: 1,
    name: '节点1',
    children: [
      {
        id: 2,
        name: '子节点1',
        children: [
          { id: 3, name: '孙节点1' }
        ]
      }
    ]
  },
  {
    id: 4,
    name: '节点2'
  }
]

添加展开/折叠功能

为树形菜单添加交互功能,可以控制子节点的显示与隐藏:

<template>
  <ul>
    <li v-for="item in treeData" :key="item.id">
      <div @click="toggle(item)">
        {{ item.name }}
        <span v-if="hasChildren(item)">{{ item.expanded ? '-' : '+' }}</span>
      </div>
      <TreeMenu 
        v-if="item.children && item.expanded" 
        :treeData="item.children"
      />
    </li>
  </ul>
</template>

<script>
export default {
  methods: {
    toggle(item) {
      if(this.hasChildren(item)) {
        this.$set(item, 'expanded', !item.expanded)
      }
    },
    hasChildren(item) {
      return item.children && item.children.length
    }
  }
}
</script>

使用插槽自定义节点内容

通过插槽机制可以灵活自定义每个节点的显示内容:

实现树形菜单vue

<template>
  <ul>
    <li v-for="item in treeData" :key="item.id">
      <slot :item="item">
        <div @click="toggle(item)">
          {{ item.name }}
        </div>
      </slot>
      <TreeMenu 
        v-if="item.children && item.expanded" 
        :treeData="item.children"
      >
        <template v-slot="{ item }">
          <slot :item="item"/>
        </template>
      </TreeMenu>
    </li>
  </ul>
</template>

添加选中状态功能

实现节点选中功能需要管理当前选中的节点:

<script>
export default {
  props: {
    value: {
      type: [String, Number],
      default: null
    }
  },
  methods: {
    selectNode(id) {
      this.$emit('input', id)
    }
  }
}
</script>

在父组件中使用:

<TreeMenu 
  v-model="selectedNode" 
  :treeData="treeData"
/>

使用第三方库

如果需要更复杂的功能,可以考虑使用专门处理树形结构的Vue组件库:

  • Vue Tree Component
  • Element UI Tree
  • Vuetify Treeview
  • Vue Draggable Tree

这些库通常提供拖拽排序、复选框选择、异步加载等高级功能,适合复杂场景使用。

标签: 菜单vue
分享给朋友:

相关文章

vue无限菜单怎么实现

vue无限菜单怎么实现

实现 Vue 无限菜单的方法 递归组件实现嵌套菜单 使用 Vue 的递归组件特性可以轻松实现无限级嵌套菜单。通过组件调用自身的方式处理嵌套数据。 <template> <ul&…

vue实现活动倒计时

vue实现活动倒计时

实现活动倒计时的基本思路 在Vue中实现活动倒计时通常需要获取当前时间与活动结束时间的差值,并将其转换为天、小时、分钟、秒的格式展示。通过定时器每秒更新显示的时间。 定义倒计时数据 在Vue组件的d…

vue实现drag

vue实现drag

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 来完成。以下是两种常见方法的实现方式。 使用 HTML5 拖拽…

vue实现input

vue实现input

Vue 实现 Input 输入框的方法 基本双向绑定 使用 v-model 指令实现双向数据绑定,适用于大多数表单场景: <template> <input v-model="…

实现.vue文件

实现.vue文件

创建.vue文件的基本结构 一个标准的.vue文件包含三个部分:模板(template)、脚本(script)和样式(style)。这种结构允许开发者在一个文件中管理组件的HTML、JavaScrip…

vue源码实现

vue源码实现

Vue 源码实现解析 Vue.js 的核心实现可以分为响应式系统、虚拟 DOM、模板编译、组件化等几个关键部分。以下是对这些核心机制的详细解析。 响应式系统 Vue 的响应式系统基于 Object.…