当前位置:首页 > VUE

vue实现菜单栏

2026-01-20 08:21:56VUE

Vue 实现菜单栏的方法

使用 Vue Router 实现动态菜单

在 Vue 项目中,可以通过 Vue Router 结合动态路由实现菜单栏功能。创建一个 Menu 组件,通过 v-for 遍历路由配置生成菜单项。

<template>
  <div class="menu">
    <ul>
      <li v-for="item in menuItems" :key="item.path">
        <router-link :to="item.path">{{ item.name }}</router-link>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      menuItems: [
        { path: '/', name: '首页' },
        { path: '/about', name: '关于' },
        { path: '/contact', name: '联系我们' }
      ]
    }
  }
}
</script>

<style scoped>
.menu ul {
  list-style: none;
  padding: 0;
}
.menu li {
  display: inline-block;
  margin-right: 20px;
}
</style>

嵌套菜单实现

对于多级菜单,可以使用递归组件实现。创建一个 MenuItem 组件处理子菜单的渲染。

vue实现菜单栏

<template>
  <li>
    <div @click="toggle">
      {{ item.name }}
      <span v-if="hasChildren">{{ isOpen ? '-' : '+' }}</span>
    </div>
    <ul v-if="hasChildren && isOpen">
      <menu-item
        v-for="child in item.children"
        :key="child.path"
        :item="child"
      />
    </ul>
  </li>
</template>

<script>
export default {
  name: 'MenuItem',
  props: {
    item: Object
  },
  data() {
    return {
      isOpen: false
    }
  },
  computed: {
    hasChildren() {
      return this.item.children && this.item.children.length
    }
  },
  methods: {
    toggle() {
      if (this.hasChildren) {
        this.isOpen = !this.isOpen
      }
    }
  }
}
</script>

使用 UI 框架快速实现

主流 Vue UI 框架如 Element UI、Ant Design Vue 都提供了现成的菜单组件。

以 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">产品1</el-menu-item>
      <el-menu-item index="2-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>

响应式菜单实现

通过 CSS 媒体查询和 Vue 的响应式数据实现移动端适配。

<template>
  <div>
    <button @click="toggleMenu" class="menu-toggle">菜单</button>
    <ul :class="{ 'show-menu': isMenuOpen }">
      <li v-for="item in menuItems" :key="item.path">
        <router-link :to="item.path">{{ item.name }}</router-link>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isMenuOpen: false,
      menuItems: [
        { path: '/', name: '首页' },
        { path: '/about', name: '关于' }
      ]
    }
  },
  methods: {
    toggleMenu() {
      this.isMenuOpen = !this.isMenuOpen
    }
  }
}
</script>

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

权限控制菜单

结合 Vuex 或 Pinia 实现基于用户角色的菜单权限控制。

<template>
  <ul>
    <li v-for="item in filteredMenu" :key="item.path">
      <router-link :to="item.path">{{ item.name }}</router-link>
    </li>
  </ul>
</template>

<script>
import { mapState } from 'vuex'

export default {
  computed: {
    ...mapState(['userRole']),
    filteredMenu() {
      return this.menuItems.filter(item => {
        return !item.roles || item.roles.includes(this.userRole)
      })
    }
  },
  data() {
    return {
      menuItems: [
        { path: '/', name: '首页' },
        { path: '/admin', name: '管理', roles: ['admin'] },
        { path: '/profile', name: '个人中心', roles: ['user', 'admin'] }
      ]
    }
  }
}
</script>

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

相关文章

vue播放倍速怎么实现

vue播放倍速怎么实现

实现Vue播放倍速的方法 在Vue中实现播放倍速功能通常涉及HTML5的<video>元素或第三方播放器库。以下是几种常见实现方式: 使用原生HTML5 video元素 通过ref获取…

vue设计与实现 书

vue设计与实现 书

vue设计与实现 书 《Vue.js设计与实现》是一本深入探讨Vue.js框架内部原理和设计思想的书籍,适合希望深入理解Vue.js的开发者。以下是关于这本书的详细信息: 书籍内容 《Vue.js…

vue实现分屏

vue实现分屏

Vue 实现分屏的方法 分屏功能通常用于展示多个独立内容区域,以下是几种常见的实现方式: 使用 CSS Grid 布局 通过 CSS Grid 可以轻松创建分屏布局,在 Vue 组件中直接应用样式:…

vue  select实现

vue select实现

Vue Select 实现方法 在 Vue 中实现下拉选择功能可以使用原生 <select> 标签或第三方库如 vue-select。以下是两种方法的详细说明: 原生 HTML Sele…

vue广告实现

vue广告实现

Vue 广告实现方法 在 Vue 项目中实现广告功能可以通过多种方式完成,具体取决于广告类型和需求。以下是几种常见的实现方法: 使用第三方广告平台 许多广告平台如 Google AdSense、百…

vue实现grid

vue实现grid

Vue 实现 Grid 布局的方法 使用 CSS Grid 布局 Vue 可以结合 CSS Grid 布局实现灵活的网格系统。CSS Grid 是现代浏览器原生支持的布局方案,无需额外依赖库。 &…