您的当前位置:首页>全部文章>文章详情

【Vue】ElementUI菜单导航结合vue-router使用

CrazyPanda发表于:2025-07-25 18:14:52浏览:0次TAG: #Vue

在 Vue 3 项目中,Element Plus 的导航栏组件(el-menu)与 Vue Router 结合使用,可以实现页面间的无缝导航。以下是具体实现方法:

一、基础实现方式

1. 安装并配置 Vue Router

确保已安装 Vue Router:
yarn add vue-router@4  # Vue 3 需要使用 v4 版本

创建路由配置文件 src/router/index.js

import { createRouter, createWebHistory } from 'vue-router'

const routes = [
  {
    path: '/',
    name: 'Home',
    component: () => import('../views/Home.vue')
  },
  {
    path: '/products',
    name: 'Products',
    component: () => import('../views/Products.vue')
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('../views/About.vue')
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router

2. 使用 router-link 作为菜单项

在 el-menu 中直接使用 router-link 组件作为菜单项,通过 index 属性绑定路由路径:
<template>
  <el-menu
    router  <!-- 启用路由模式 -->
    :default-active="activePath"
    class="el-menu-demo"
    mode="horizontal"
  >
    <el-menu-item index="/">首页</el-menu-item>
    <el-menu-item index="/products">产品中心</el-menu-item>
    <el-menu-item index="/about">关于我们</el-menu-item>
  </el-menu>
</template>

<script setup>
import { ref, computed, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'

const router = useRouter()
const route = useRoute()

// 获取当前路由路径作为激活状态
const activePath = computed(() => route.path)
</script>

二、高级用法:动态路由导航

1. 基于路由配置生成导航菜单

从路由配置中自动生成导航菜单,避免手动维护重复代码:
<template>
  <el-menu router :default-active="activePath" mode="horizontal">
    <el-menu-item 
      v-for="route in routes" 
      :key="route.path" 
      :index="route.path"
    >
      {{ route.name }}
    </el-menu-item>
  </el-menu>
</template>

<script setup>
import { useRouter, useRoute } from 'vue-router'
import routes from '@/router'  // 导入路由配置

const router = useRouter()
const route = useRoute()

// 过滤出需要在导航栏显示的路由
const routes = computed(() => 
  router.options.routes.filter(route => !route.hidden)
)

// 当前激活路径
const activePath = computed(() => route.path)
</script>

2. 嵌套路由与子菜单

对于嵌套路由,使用 el-sub-menu 组件:
<template>
  <el-menu router :default-active="activePath" mode="horizontal">
    <el-menu-item index="/">首页</el-menu-item>
    
    <el-sub-menu index="products">
      <template #title>产品中心</template>
      <el-menu-item index="/products/list">产品列表</el-menu-item>
      <el-menu-item index="/products/detail">产品详情</el-menu-item>
    </el-sub-menu>
    
    <el-menu-item index="/about">关于我们</el-menu-item>
  </el-menu>
</template>

三、导航栏与路由状态同步

1. 监听路由变化

使用 watch 监听路由变化,实现导航栏与路由状态的同步:
<script setup>
import { ref, watch } from 'vue'
import { useRoute } from 'vue-router'

const route = useRoute()
const activePath = ref(route.path)

// 监听路由变化,更新激活状态
watch(() => route.path, (newPath) => {
  activePath.value = newPath
})
</script>

2. 自定义导航守卫

在路由导航守卫中处理权限验证或导航动画:
// router/index.js
router.beforeEach((to, from, next) => {
  // 权限验证
  if (to.meta.requiresAuth && !isAuthenticated()) {
    next('/login')
  } else {
    next()
  }
})

四、完整示例:响应式导航栏

结合 Vue Router 和 Element Plus 实现一个响应式导航栏,包含移动端适配:
<template>
  <div class="header">
    <div class="logo">企业Logo</div>
    
    <!-- 桌面端导航 -->
    <el-menu
      router
      :default-active="activePath"
      mode="horizontal"
      class="desktop-menu"
    >
      <el-menu-item index="/">首页</el-menu-item>
      <el-sub-menu index="products">
        <template #title>产品中心</template>
        <el-menu-item index="/products/list">产品列表</el-menu-item>
        <el-menu-item index="/products/detail">产品详情</el-menu-item>
      </el-sub-menu>
      <el-menu-item index="/about">关于我们</el-menu-item>
      <el-menu-item index="/contact">联系我们</el-menu-item>
    </el-menu>
    
    <!-- 移动端导航触发器 -->
    <el-button 
      v-if="isMobile" 
      type="text" 
      @click="showMobileMenu = true"
    >
      <el-icon><Bars /></el-icon>
    </el-button>
    
    <!-- 移动端导航抽屉 -->
    <el-drawer 
      v-model="showMobileMenu" 
      direction="rtl"
      size="200px"
    >
      <el-menu
        router
        :default-active="activePath"
        mode="vertical"
        class="mobile-menu"
      >
        <el-menu-item index="/">首页</el-menu-item>
        <el-sub-menu index="products">
          <template #title>产品中心</template>
          <el-menu-item index="/products/list">产品列表</el-menu-item>
          <el-menu-item index="/products/detail">产品详情</el-menu-item>
        </el-sub-menu>
        <el-menu-item index="/about">关于我们</el-menu-item>
        <el-menu-item index="/contact">联系我们</el-menu-item>
      </el-menu>
    </el-drawer>
  </div>
</template>

<script setup>
import { ref, computed, onMounted, watch } from 'vue'
import { useRoute } from 'vue-router'
import { Bars } from '@element-plus/icons-vue'

const route = useRoute()
const activePath = ref(route.path)
const showMobileMenu = ref(false)
const isMobile = ref(window.innerWidth < 768)

// 监听路由变化
watch(() => route.path, (newPath) => {
  activePath.value = newPath
  // 路由切换后关闭移动端菜单
  if (showMobileMenu.value) {
    showMobileMenu.value = false
  }
})

// 监听窗口大小变化,处理响应式
const handleResize = () => {
  isMobile.value = window.innerWidth < 768
}

onMounted(() => {
  window.addEventListener('resize', handleResize)
})

onUnmounted(() => {
  window.removeEventListener('resize', handleResize)
})
</script>

<style scoped>
.header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 20px;
  height: 60px;
  background-color: #fff;
  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}

.logo {
  font-size: 20px;
  font-weight: bold;
}

.desktop-menu {
  border-bottom: none;
}

.mobile-menu {
  border-right: none;
}

/* 移动端隐藏桌面菜单 */
@media (max-width: 768px) {
  .desktop-menu {
    display: none;
  }
}

/* 桌面端隐藏移动端菜单触发器 */
@media (min-width: 769px) {
  .mobile-menu-trigger {
    display: none;
  }
}
</style>

五、关键配置说明

  1. router 属性
    在 el-menu 中添加 router 属性,启用路由模式,菜单项的 index 将被视为路由路径。
  2. 动态激活状态
    通过 :default-active="activePath" 绑定当前路由路径,实现导航栏高亮。
  3. 导航守卫
    利用 Vue Router 的导航守卫(beforeEachafterEach)处理权限验证、页面加载动画等。
  4. 响应式设计
    结合 CSS 媒体查询和 JavaScript 监听窗口大小变化,实现移动端和桌面端不同的导航布局。
通过以上方式,你可以实现一个功能完善、交互流畅的企业级导航系统,同时保持代码的可维护性和可扩展性。

猜你喜欢

【Vue】vue3比vue2好在哪里
vue 3 优于 vue 2 的关键优势包括:性能提升:响应式系统重写,优化更新速度虚拟 dom 优化,提高渲染效率代码组织和可维护性:组合式 api,提升可维护性teleport 和 suspense,提高代码灵活性和可读性开发者体验:更好的调试工具,简化调试过程typescript 2.7 支持,增强代码提示和类型检查Vue 3 与 Vue 2 的优势对比核心性能提升响应式系统重写:Vue 3 引入 Reactivity API,优化了响应式系统的性能,提升了更新速度。虚拟 DOM 优化:采
发表于:2024-04-28 浏览:322 TAG:
【Vue】前端框架 Vue3框架 使用总结(一) Vue框架的基础使用
目录一、Vue3框架基础1、创建项目2、项目结构3、Vue基础语法4、组件之间通信5、组合式api二、VueRouter的基础使用1、安装2、使用案例3、完整案例步骤4、调优-路由懒加载三、Vuex数据管理1、实现案例&nbsp;2、更改store状态,同步操作3、store中的计算属性4、redux里的异步操作Action5、模块化管理四、网络请求Vue3官方文档:Vue.js - 渐进式 JavaScript 框架 | Vue.js基础部分见官方文档一、Vue3框架基础1、创建项目安装yar
发表于:2023-12-05 浏览:842 TAG:
【Vue】vue创建应用并运行
简介Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。Vue 是一个框架,也是一个生态。其功能覆盖了大部分前端开发常见的需求。但 Web 世界是十分多样化的,不同的开发者在 Web 上构建的东西可能在形式和规模上会有很大的不同。考虑到这一点,Vue 的设计非常注重灵活性和
发表于:2024-04-23 浏览:375 TAG:
【VUE】Windows系统使用vite创建vue项目
1.准备环境:windows11nodejs:v22.17.02.安装vite我本地安装的yarn,所以我使用yarn安装viteyarnglobaladdcreate-vite3.创建项目切换到要参...
发表于:2025-07-24 浏览:3 TAG: #Vue
【Vue】如何在 Vue 中直接引入 JS 文件
直接在 Vue 组件中引入外部 JS 文件有以下步骤:1. 在 &lt;script&gt; 标签中引入 JS 文件&lt;/script&gt;&lt;script&gt; //&nbsp;直接导入&nbsp;JS&nbsp;文件 import&nbsp;myModule&nbsp;from&nbsp;&#39;@/path/to/myModule.js&#39;; //&nbsp;使用导入的模块 console.log(myModule.someFunction()); &lt;/scri
发表于:2024-05-19 浏览:241 TAG:
【Vue】Antd Pro Vue的使用(七) —— 年份选择组件配置
ant design vue组件中没有现成的年份组件可使用,不过可通过配置来实现年份选择。先看实现效果:关闭效果:展开效果:配置如下:&lt;a-date-picker &nbsp;&nbsp;&nbsp;&nbsp;mode=&quot;year&quot; &nbsp;&nbsp;&nbsp;&nbsp;format=&quot;YYYY&quot; &nbsp;&nbsp;&nbsp;&nbsp;:style=&quot;{width:&nbsp;&#39;256px&#39;}&amp;quot
发表于:2024-05-09 浏览:288 TAG:
【Vue】Antd Pro Vue的使用(八) —— 表单组件的常用配置
1、清除配置allow-clear在ant design react组件中,表单组件默认都有清除按钮(输入框右侧的小黑叉号),在vue组件中需要自己配置,即给组件加上allow-clear属性并且所有组件都支持这个属性,a-input、a-select、a-textarea、a-date-picker等都支持&lt;a-form-item&nbsp;label=&quot;用户名&quot;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;a-input&nbsp; &nbsp;
发表于:2024-05-10 浏览:288 TAG:
【Vue】Vue项目使用vue-router路由
在 Vite 创建的 Vue 项目中开发自定义页面,通常需要创建路由、组件和视图。以下是完整的开发流程:
发表于:2025-07-25 浏览:1 TAG: #Vue
【Vue】Antd Pro Vue的使用(九) —— 抽屉a-drawer的操作按钮设置
在antd pro vue2中,a-drawer默认是没有操作按钮的,只有右上角的关闭&#39;X&#39;号,需要自己配置提交和取消按钮提交方法对应@submit方法,取消方法对应@close方法(a-model对应的取消方法是@cancel),都是父页面传过来的方法&lt;a-drawer &nbsp;&nbsp;&nbsp;&nbsp;:title=&quot;model&nbsp;?&nbsp;&#39;编辑类型&#39;&nbsp;:&nbsp;&#39;新建类型&#39;&quot;
发表于:2024-05-10 浏览:339 TAG:
【Vue】Vue中使用vue-router的妙用详解
vue是当前最热门的前端框架之一,它不仅简洁易用,而且具有强大的扩展性,其中一个值得关注的插件就是vue-router。vue-router是vue官方路由插件,它可以更好地控制vue应用中的路由导航,使路由与组件之间的关系更加清晰,提升了用户的交互体验。本文将详细解读vue-router的使用方法及妙用。一、安装和使用在使用vue-router之前,需要先安装它。可以使用npm包管理器来安装vue-router插件。安装命令如下:npm&nbsp;install&nbsp;vue-router
发表于:2024-04-29 浏览:302 TAG: