当前位置:首页 > VUE

vue实现菜单树

2026-03-10 05:56:21VUE

实现菜单树的基本思路

在Vue中实现菜单树通常需要递归组件来处理嵌套的树形结构数据。核心是通过组件自身调用自身的方式渲染子菜单,并利用CSS控制缩进和交互效果。

数据结构示例

菜单数据通常是一个嵌套结构的数组对象,每个节点包含标题、唯一标识、子节点等属性:

const menuData = [
  {
    id: 1,
    title: '首页',
    children: []
  },
  {
    id: 2,
    title: '产品管理',
    children: [
      {
        id: 21,
        title: '产品列表',
        children: []
      }
    ]
  }
]

递归组件实现

创建名为TreeMenu.vue的组件:

vue实现菜单树

<template>
  <ul class="menu-tree">
    <li v-for="item in treeData" :key="item.id">
      <div @click="toggleChildren(item)">
        {{ item.title }}
        <span v-if="item.children?.length">[{{ item.isOpen ? '-' : '+' }}]</span>
      </div>
      <tree-menu 
        v-if="item.children && item.isOpen"
        :tree-data="item.children"
        class="sub-menu"
      />
    </li>
  </ul>
</template>

<script>
export default {
  name: 'TreeMenu',
  props: {
    treeData: {
      type: Array,
      required: true
    }
  },
  methods: {
    toggleChildren(item) {
      if (item.children?.length) {
        this.$set(item, 'isOpen', !item.isOpen)
      }
    }
  }
}
</script>

<style>
.menu-tree {
  list-style: none;
  padding-left: 20px;
}
.sub-menu {
  margin-left: 15px;
}
</style>

使用组件

在父组件中引入并使用:

<template>
  <div>
    <tree-menu :tree-data="menuData" />
  </div>
</template>

<script>
import TreeMenu from './TreeMenu.vue'

export default {
  components: { TreeMenu },
  data() {
    return {
      menuData: [...] // 你的菜单数据
    }
  }
}
</script>

进阶优化方向

添加默认展开/折叠控制

vue实现菜单树

// 在数据初始化时添加状态
function initMenuData(data) {
  return data.map(item => {
    return {
      ...item,
      isOpen: false,
      children: item.children ? initMenuData(item.children) : []
    }
  })
}

添加路由跳转功能

<div @click="handleItemClick(item)">
  {{ item.title }}
</div>

methods: {
  handleItemClick(item) {
    if (item.path) {
      this.$router.push(item.path)
    } else if (item.children?.length) {
      this.toggleChildren(item)
    }
  }
}

使用第三方库

对于复杂需求可以考虑使用现成的树形组件库:

  • vue-tree-list:提供拖拽、复选框等功能
  • element-uiel-tree组件
  • ant-design-vuea-tree组件

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

相关文章

vue请求实现进度条

vue请求实现进度条

实现请求进度条的方法 在Vue中实现请求进度条可以通过多种方式完成,常见的有使用第三方库如axios结合nprogress或自定义进度条组件。以下是几种实现方法: 使用axios和nprogress…

vue 实现blog

vue 实现blog

Vue 实现博客的基本步骤 使用 Vue 实现博客可以分为前端和后端两部分,前端使用 Vue.js 框架,后端可以选择 Node.js、Python 或其他服务端语言。以下是一个基于 Vue 的博客实…

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 <template> &l…

vue实现新闻

vue实现新闻

Vue 实现新闻功能 使用 Vue 实现新闻功能通常涉及新闻列表展示、新闻详情页、分类筛选等模块。以下是实现的基本思路和代码示例。 新闻列表展示 通过 Vue 组件展示新闻列表,通常使用 v-for…

vue实现文字

vue实现文字

Vue 中实现文字显示的方法 在 Vue 中实现文字显示可以通过多种方式,包括插值表达式、指令、组件等。以下是几种常见的实现方法: 插值表达式 使用双大括号 {{ }} 进行文本插值,这是 Vue…

vue实现vnc

vue实现vnc

Vue 实现 VNC 客户端 在 Vue 项目中实现 VNC 客户端功能,可以通过集成现有的 VNC 客户端库或组件完成。以下是具体实现方法: 安装依赖库 使用 noVNC 或其他 VNC 客户端…