当前位置:首页 > VUE

vue实现菜单

2026-01-11 20:52:30VUE

使用 Vue 实现菜单

Vue 可以轻松实现动态菜单,通常结合路由和组件化思想。以下是一个基于 Vue 3 和 Vue Router 的菜单实现方案:

基础菜单结构

在 Vue 中,菜单通常是一个递归组件,能够处理多级嵌套。创建一个 Menu.vue 组件:

<template>
  <ul>
    <li v-for="item in menuItems" :key="item.path">
      <router-link v-if="!item.children" :to="item.path">
        {{ item.title }}
      </router-link>

      <template v-else>
        <span>{{ item.title }}</span>
        <Menu :menu-items="item.children" />
      </template>
    </li>
  </ul>
</template>

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

路由配置

在路由配置中定义菜单结构:

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home,
    meta: { title: '首页' }
  },
  {
    path: '/products',
    name: 'Products',
    component: Products,
    meta: { title: '产品' },
    children: [
      {
        path: 'list',
        name: 'ProductList',
        component: ProductList,
        meta: { title: '产品列表' }
      }
    ]
  }
]

动态生成菜单

从路由配置中提取菜单项:

function generateMenuItems(routes) {
  return routes.map(route => {
    const item = {
      path: route.path,
      title: route.meta?.title || route.name
    }

    if (route.children) {
      item.children = generateMenuItems(route.children)
    }

    return item
  })
}

状态管理

对于需要根据权限动态变化的菜单,可以使用 Pinia 或 Vuex 管理菜单状态:

// stores/menu.js
import { defineStore } from 'pinia'

export const useMenuStore = defineStore('menu', {
  state: () => ({
    menuItems: []
  }),
  actions: {
    async fetchMenu() {
      const response = await fetch('/api/menu')
      this.menuItems = await response.json()
    }
  }
})

响应式菜单

添加响应式特性,在小屏幕设备上显示汉堡菜单:

<template>
  <button @click="toggleMenu">☰</button>
  <nav :class="{ 'menu-visible': isMenuVisible }">
    <Menu :menu-items="menuItems" />
  </nav>
</template>

<script>
import { ref } from 'vue'
import Menu from './Menu.vue'

export default {
  components: { Menu },
  setup() {
    const isMenuVisible = ref(false)

    const toggleMenu = () => {
      isMenuVisible.value = !isMenuVisible.value
    }

    return { isMenuVisible, toggleMenu }
  }
}
</script>

<style>
.menu-visible {
  display: block;
}
</style>

权限控制

实现基于角色的菜单过滤:

function filterMenuByRole(menuItems, userRole) {
  return menuItems.filter(item => {
    if (item.roles && !item.roles.includes(userRole)) {
      return false
    }

    if (item.children) {
      item.children = filterMenuByRole(item.children, userRole)
    }

    return true
  })
}

动画效果

为菜单添加过渡动画:

<template>
  <Transition name="slide">
    <nav v-if="isMenuVisible">
      <Menu :menu-items="menuItems" />
    </nav>
  </Transition>
</template>

<style>
.slide-enter-active, .slide-leave-active {
  transition: transform 0.3s ease;
}

.slide-enter-from, .slide-leave-to {
  transform: translateX(-100%);
}
</style>

完整实现示例

将上述各部分组合起来,创建一个完整的菜单系统:

vue实现菜单

  1. 定义路由配置
  2. 创建可递归的菜单组件
  3. 添加状态管理
  4. 实现响应式布局
  5. 加入权限控制
  6. 添加动画效果

这种实现方式灵活可扩展,能够适应各种复杂菜单需求。

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

相关文章

vue 实现权限

vue 实现权限

Vue 实现权限控制的方法 在 Vue 项目中实现权限控制通常涉及前端路由、组件和按钮级别的权限管理。以下是几种常见的实现方式: 路由权限控制 通过路由守卫实现权限验证,过滤用户无权访问的路由:…

vue实现数组

vue实现数组

Vue 实现数组操作的方法 在 Vue 中,数组的操作需要特别注意响应式的问题。Vue 提供了一些方法来确保数组的变动能够触发视图更新。 响应式数组方法 Vue 对以下数组方法进行了封装,确保它们能…

vue轮播实现

vue轮播实现

Vue 轮播实现方法 使用第三方库(推荐) 安装 swiper 或 vue-awesome-swiper 库,快速实现功能丰富的轮播效果。 以 vue-awesome-swiper 为例: npm…

vue实现 hover

vue实现 hover

实现 Vue 中的 hover 效果 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是常见的几种方法: 使用 CSS 伪类 最简单的方式是直接使用 CSS 的 :hover 伪类,无…

vue实现ftp

vue实现ftp

Vue 中实现 FTP 功能 Vue 本身是一个前端框架,无法直接操作 FTP 协议(FTP 通常需要后端支持)。以下是两种常见实现方式: 前端与后端配合实现 FTP 前端通过 API 与后端通信,…

vue实现首页

vue实现首页

Vue 实现首页的基本步骤 安装 Vue.js 和相关依赖,可以通过 Vue CLI 或 Vite 快速初始化项目。Vue CLI 适合传统项目,Vite 更适合现代前端开发。 npm instal…