当前位置:首页 > VUE

vue 实现菜单栏

2026-02-20 20:57:00VUE

Vue 实现菜单栏的方法

使用 Vue Router 实现动态菜单

通过 Vue Router 可以方便地实现动态菜单栏,结合路由配置生成菜单项。

// router/index.js
const routes = [
  {
    path: '/home',
    name: 'Home',
    component: Home,
    meta: { title: '首页', icon: 'el-icon-house' }
  },
  {
    path: '/about',
    name: 'About',
    component: About,
    meta: { title: '关于', icon: 'el-icon-info' }
  }
]
<!-- Menu.vue -->
<template>
  <div class="menu">
    <router-link 
      v-for="route in routes" 
      :key="route.name"
      :to="route.path"
      class="menu-item"
    >
      <i :class="route.meta.icon"></i>
      <span>{{ route.meta.title }}</span>
    </router-link>
  </div>
</template>

<script>
export default {
  computed: {
    routes() {
      return this.$router.options.routes.filter(r => r.meta)
    }
  }
}
</script>

使用 Element UI 的菜单组件

如果项目使用 Element UI,可以直接使用其提供的菜单组件。

vue 实现菜单栏

<template>
  <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">产品列表</el-menu-item>
      <el-menu-item index="2-2">产品详情</el-menu-item>
    </el-submenu>
    <el-menu-item index="3">关于我们</el-menu-item>
  </el-menu>
</template>

<script>
export default {
  data() {
    return {
      activeIndex: '1'
    }
  },
  methods: {
    handleSelect(key) {
      console.log(key)
    }
  }
}
</script>

实现递归菜单组件

对于多层嵌套的菜单结构,可以使用递归组件实现。

vue 实现菜单栏

<!-- RecursiveMenu.vue -->
<template>
  <ul class="menu">
    <li v-for="item in menuData" :key="item.id">
      <a :href="item.path">{{ item.title }}</a>
      <recursive-menu 
        v-if="item.children && item.children.length"
        :menu-data="item.children"
      />
    </li>
  </ul>
</template>

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

响应式菜单实现

使用 Vue 的响应式特性,可以根据屏幕尺寸切换菜单显示方式。

<template>
  <div class="menu-container">
    <button @click="toggleMenu">☰</button>
    <nav :class="{ 'show': isMenuOpen }">
      <ul>
        <li v-for="item in menuItems" :key="item.id">
          <a :href="item.link">{{ item.text }}</a>
        </li>
      </ul>
    </nav>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isMenuOpen: false,
      menuItems: [
        { id: 1, text: '首页', link: '/' },
        { id: 2, text: '产品', link: '/products' }
      ]
    }
  },
  methods: {
    toggleMenu() {
      this.isMenuOpen = !this.isMenuOpen
    }
  }
}
</script>

<style>
@media (max-width: 768px) {
  nav {
    display: none;
  }
  nav.show {
    display: block;
  }
}
</style>

使用 Vuex 管理菜单状态

对于复杂的应用,可以使用 Vuex 集中管理菜单状态。

// store/modules/menu.js
export default {
  state: {
    collapsed: false,
    activeMenu: 'home'
  },
  mutations: {
    toggleCollapse(state) {
      state.collapsed = !state.collapsed
    },
    setActiveMenu(state, menu) {
      state.activeMenu = menu
    }
  }
}
<template>
  <div :class="{ 'collapsed': isCollapsed }">
    <menu-item 
      v-for="item in menuItems"
      :key="item.id"
      :item="item"
      :is-active="activeMenu === item.id"
      @click="selectMenu(item.id)"
    />
    <button @click="toggleCollapse">折叠/展开</button>
  </div>
</template>

<script>
import { mapState, mapMutations } from 'vuex'

export default {
  computed: {
    ...mapState('menu', ['isCollapsed', 'activeMenu'])
  },
  methods: {
    ...mapMutations('menu', ['toggleCollapse', 'setActiveMenu']),
    selectMenu(menuId) {
      this.setActiveMenu(menuId)
    }
  }
}
</script>

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

相关文章

vue设计与实现下载

vue设计与实现下载

vue设计与实现电子书下载 《Vue.js设计与实现》是一本深入解析Vue.js框架原理的书籍,由霍春阳(HcySunYang)撰写。以下是获取该资源的常见途径: 正版购买渠道 京东、…

vue实现轮询

vue实现轮询

实现轮询的基本方法 在Vue中实现轮询可以通过setInterval或setTimeout配合递归调用完成。轮询通常用于定期向服务器请求数据更新。 使用setInterval的简单示例: data…

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue实现$.extend

vue实现$.extend

Vue 实现类似 jQuery 的 $.extend 功能 在 Vue 中实现类似 jQuery 的 $.extend 功能,可以通过多种方式完成。$.extend 主要用于合并多个对象的属性,Vue…

vue nexttrick实现

vue nexttrick实现

Vue 中 nextTick 的实现原理 nextTick 是 Vue 提供的一个异步方法,用于在下次 DOM 更新循环结束之后执行延迟回调。它利用了 JavaScript 的事件循环机制,确保回调在…

vue实现接口连接

vue实现接口连接

Vue 实现接口连接的常用方法 Vue 中实现接口连接通常需要借助 HTTP 客户端库,以下是几种常见实现方式: 使用 Axios Axios 是流行的 HTTP 客户端库,支持 Promise A…