当前位置:首页 > 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 组件处理子菜单的渲染。

<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 为例:

<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 实现基于用户角色的菜单权限控制。

vue实现菜单栏

<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实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并触发点击事件实现文件下载。适用于直接下载服务器上的静态文件或 Blob 数据。 downloadFile(url, fileName) { c…

vue实现本地数据存储

vue实现本地数据存储

使用 localStorage 或 sessionStorage Vue 中可以直接调用浏览器提供的 localStorage 或 sessionStorage API 进行数据存储。localSto…

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成列…

vue优秀实现

vue优秀实现

Vue.js 优秀实现方法 响应式数据管理 使用 Vue 的 ref 和 reactive 处理基础类型和对象类型数据,结合 computed 计算属性优化渲染性能。对于复杂状态,推荐 Pinia 替…

vue 实现闪烁

vue 实现闪烁

Vue 实现闪烁效果的方法 方法一:使用 CSS 动画 在 Vue 组件中定义一个闪烁的 CSS 动画,通过绑定 class 或 style 来控制元素的闪烁效果。 <template>…

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个渐进式 JavaScript 框架,广泛用于构建用户界面。以下是 Vue 功能的常见实现方法。 数据绑定 Vue 的核心功能之一是数据绑定,通过 v-mod…