当前位置:首页 > VUE

vue 菜单实现

2026-01-13 02:34:49VUE

Vue 菜单实现方法

基于路由的动态菜单

在 Vue 项目中,可以利用 Vue Router 实现动态菜单。首先定义路由配置,包含菜单所需的元信息(如标题、图标等)。

const routes = [
  {
    path: '/dashboard',
    name: 'Dashboard',
    component: Dashboard,
    meta: { title: '控制台', icon: 'el-icon-s-home' }
  },
  {
    path: '/user',
    name: 'User',
    component: User,
    meta: { title: '用户管理', icon: 'el-icon-user' }
  }
]

通过 this.$router.options.routes 获取路由配置,渲染菜单组件:

<template>
  <el-menu :default-active="$route.path" router>
    <template v-for="route in $router.options.routes">
      <el-menu-item 
        :index="route.path" 
        :key="route.path"
      >
        <i :class="route.meta.icon"></i>
        <span>{{ route.meta.title }}</span>
      </el-menu-item>
    </template>
  </el-menu>
</template>

递归实现多级菜单

对于嵌套菜单,需要使用递归组件处理多级路由:

<template>
  <el-menu :default-active="$route.path" router>
    <template v-for="item in menuData">
      <sub-menu 
        v-if="item.children" 
        :key="item.path" 
        :item="item"
      />
      <el-menu-item 
        v-else 
        :key="item.path" 
        :index="item.path"
      >
        <i :class="item.meta.icon"></i>
        <span>{{ item.meta.title }}</span>
      </el-menu-item>
    </template>
  </el-menu>
</template>

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

export default {
  components: { SubMenu },
  computed: {
    menuData() {
      return this.$router.options.routes
    }
  }
}
</script>

子菜单组件 SubMenu.vue

<template>
  <el-submenu :index="item.path">
    <template #title>
      <i :class="item.meta.icon"></i>
      <span>{{ item.meta.title }}</span>
    </template>
    <template v-for="child in item.children">
      <sub-menu 
        v-if="child.children" 
        :key="child.path" 
        :item="child"
      />
      <el-menu-item 
        v-else 
        :key="child.path" 
        :index="child.path"
      >
        {{ child.meta.title }}
      </el-menu-item>
    </template>
  </el-submenu>
</template>

权限控制菜单

结合权限系统过滤可见菜单项:

vue 菜单实现

computed: {
  filteredMenu() {
    return this.$router.options.routes.filter(route => {
      const requiredRole = route.meta.role
      return !requiredRole || this.userRoles.includes(requiredRole)
    })
  }
}

使用 UI 组件库

Element UI 的菜单组件示例:

<el-menu
  :default-active="activeIndex"
  mode="horizontal"
  @select="handleSelect"
>
  <el-menu-item index="1">处理中心</el-menu-item>
  <el-submenu index="2">
    <template #title>我的工作台</template>
    <el-menu-item index="2-1">选项1</el-menu-item>
    <el-menu-item index="2-2">选项2</el-menu-item>
  </el-submenu>
</el-menu>

Ant Design Vue 的菜单组件:

<a-menu v-model:selectedKeys="current" mode="horizontal">
  <a-menu-item key="mail">
    <template #icon>
      <mail-outlined />
    </template>
    Navigation One
  </a-menu-item>
  <a-sub-menu key="sub">
    <template #icon>
      <setting-outlined />
    </template>
    <template #title>Navigation Three - Submenu</template>
    <a-menu-item key="setting:1">Option 1</a-menu-item>
    <a-menu-item key="setting:2">Option 2</a-menu-item>
  </a-sub-menu>
</a-menu>

响应式菜单

通过 CSS 媒体查询实现响应式布局:

vue 菜单实现

@media (max-width: 768px) {
  .el-menu--horizontal {
    flex-direction: column;
  }
}

结合 Vue 的响应式数据控制菜单折叠:

<el-menu 
  :collapse="isCollapse"
  :collapse-transition="false"
>
  <!-- 菜单项 -->
</el-menu>

<button @click="isCollapse = !isCollapse">
  {{ isCollapse ? '展开' : '折叠' }}
</button>

面包屑导航实现

配合菜单实现面包屑导航:

computed: {
  breadcrumbs() {
    const matched = this.$route.matched.filter(
      item => item.meta && item.meta.title
    )
    return matched.map(item => ({
      path: item.path,
      title: item.meta.title
    }))
  }
}

模板部分:

<el-breadcrumb separator="/">
  <el-breadcrumb-item 
    v-for="item in breadcrumbs" 
    :key="item.path"
    :to="item.path"
  >
    {{ item.title }}
  </el-breadcrumb-item>
</el-breadcrumb>

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

相关文章

vue 实现blog

vue 实现blog

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

vue 实现fadeout

vue 实现fadeout

Vue 实现淡出效果 在 Vue 中实现淡出(fade-out)效果可以通过 CSS 过渡或动画结合 Vue 的动态渲染功能完成。以下是几种常见方法: 使用 Vue 过渡(Transition)组件…

vue实现flbook

vue实现flbook

Vue 实现类似 Flbook 的翻页效果 要实现类似 Flbook 的翻页效果,可以使用 Vue 结合 CSS 动画和 JavaScript 事件处理。以下是实现方法: 安装依赖 需要安装 vue…

vue实现dag

vue实现dag

Vue实现DAG(有向无环图) 在Vue中实现DAG(Directed Acyclic Graph,有向无环图)通常涉及数据结构的建模、可视化渲染以及交互逻辑处理。以下是关键实现步骤和示例代码: 数…

vue实现popper

vue实现popper

Vue 实现 Popper 的方法 使用 Tippy.js 库 Tippy.js 是一个轻量级的 Popper.js 封装库,提供丰富的工具提示功能。安装 Tippy.js 及其 Vue 封装: n…

mvvm实现vue

mvvm实现vue

MVVM 模式在 Vue 中的实现 MVVM(Model-View-ViewModel)是一种前端架构模式,Vue 的设计灵感来源于此。以下是 MVVM 在 Vue 中的核心实现方式: 数据绑定(M…