当前位置:首页 > VUE

vue 实现多级菜单

2026-03-10 07:19:26VUE

实现多级菜单的基本思路

使用递归组件或动态路由结合嵌套数据结构(如树形结构)实现多级菜单渲染。核心是通过组件自身调用自身处理子菜单,并利用 v-for 和条件渲染控制层级展开。

数据结构示例

菜单数据通常为嵌套数组,每个菜单项包含 children 字段表示子菜单:

const menuData = [
  {
    title: "一级菜单1",
    children: [
      { title: "二级菜单1-1", children: [] },
      { title: "二级菜单1-2", children: [
        { title: "三级菜单1-2-1", children: [] }
      ]}
    ]
  },
  {
    title: "一级菜单2",
    children: []
  }
];

递归组件实现

创建 MenuComponent.vue,通过 name 属性实现递归调用:

<template>
  <ul>
    <li v-for="item in menuList" :key="item.title">
      <span @click="toggleChildren(item)">{{ item.title }}</span>
      <MenuComponent 
        v-if="item.showChildren && item.children.length" 
        :menuList="item.children"
      />
    </li>
  </ul>
</template>

<script>
export default {
  name: "MenuComponent", // 关键:通过name实现递归
  props: {
    menuList: Array
  },
  methods: {
    toggleChildren(item) {
      item.showChildren = !item.showChildren;
    }
  }
};
</script>

动态路由集成

若需与路由结合,可在菜单数据中添加 path 字段,并通过 router-link 导航:

// 路由配置
const routes = [
  { path: '/menu1', component: Page1, children: [
    { path: 'submenu1', component: SubPage1 }
  ]}
];
<!-- 修改递归组件中的渲染部分 -->
<router-link v-if="item.path" :to="item.path">{{ item.title }}</router-link>
<span v-else @click="toggleChildren(item)">{{ item.title }}</span>

样式与交互优化

通过 CSS 控制缩进和动画增强用户体验:

vue  实现多级菜单

ul {
  list-style: none;
  padding-left: 20px;
}
li {
  margin: 5px 0;
  transition: all 0.3s;
}

注意事项

  • 性能:深层嵌套时需限制递归深度,避免大量渲染。
  • 状态管理:若菜单状态需全局共享(如折叠状态),建议使用 Vuex 或 Pinia。
  • 唯一键值:确保 key 使用唯一标识(如 id 而非 title)。

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

相关文章

vue前端分页怎么实现

vue前端分页怎么实现

前端分页实现方法 在Vue中实现前端分页通常涉及数据分割和页面控制逻辑。以下是常见的实现方式: 使用计算属性分页 通过计算属性对数据进行切片处理: computed: { paginatedD…

vue实现a

vue实现a

Vue 实现 A 功能的方法 在 Vue 中实现 A 功能可以通过多种方式,具体取决于 A 功能的具体需求。以下是几种常见的实现方法: 使用 Vue 组件 通过创建自定义组件来实现 A 功能。组件可…

vue 实现表单

vue 实现表单

Vue 表单实现方法 Vue.js 提供了多种方式实现表单,包括双向数据绑定、表单验证和动态表单生成。以下是常见的实现方法: 基础表单绑定 使用 v-model 指令实现表单元素与数据的双向绑定:…

vue实现分发

vue实现分发

Vue 实现分发的方法 在 Vue 中,分发(Distribution)通常指的是将内容从父组件传递到子组件,或者通过插槽(Slots)机制让父组件控制子组件的部分渲染内容。以下是几种常见的实现分发的…

vue实现 单选

vue实现 单选

实现 Vue 单选功能 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 可以轻松实现单选功能,将单选按钮的值绑定到同…

vue实现分栏

vue实现分栏

Vue实现分栏的常见方法 使用CSS Flexbox布局 通过Flexbox可以快速实现分栏效果,适合大多数响应式布局场景 <template> <div class="con…