当前位置:首页 > 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 实现弹窗的常见方法 使用组件化方式封装弹窗 创建一个独立的弹窗组件(如 Modal.vue),通过 v-if 或 v-show 控制显示隐藏: <template> <…

vue 实现挂载

vue 实现挂载

Vue 实现挂载的基本方法 在 Vue 中,挂载是将 Vue 实例与 DOM 元素关联的过程。通过挂载,Vue 可以管理 DOM 并实现数据绑定和响应式更新。 创建 Vue 实例并挂载 const…

vue实现详情

vue实现详情

Vue 实现详情页的常见方法 使用动态路由 在 Vue Router 中配置动态路由参数,通过 $route.params 获取详情 ID。示例路由配置: { path: '/detail/:i…

vue分类实现

vue分类实现

Vue分类实现方法 在Vue中实现分类功能通常涉及数据分组、动态渲染和交互逻辑。以下是几种常见的实现方式: 基于计算属性的分类 通过计算属性对原始数据进行分组处理,适合静态或少量数据分类: com…

vue页面实现

vue页面实现

Vue 页面实现方法 创建 Vue 组件 使用 Vue 单文件组件(SFC)方式创建页面,文件扩展名为 .vue。一个基本的 Vue 组件包含三个部分:模板(template)、脚本(script)和…

vue实现markdown

vue实现markdown

Vue 实现 Markdown 编辑器 在 Vue 中实现 Markdown 编辑器可以通过集成第三方库或自定义解析器完成。以下是两种常见方法: 使用第三方库(如 marked 或 markdown…