当前位置:首页 > VUE

vue 实现多级菜单

2026-02-18 18:04:44VUE

Vue 实现多级菜单的方法

递归组件实现

递归组件是实现多级菜单的核心技术。通过组件调用自身,可以动态渲染任意层级的菜单结构。

<template>
  <ul>
    <li v-for="item in menuData" :key="item.id">
      {{ item.name }}
      <menu-item v-if="item.children" :menu-data="item.children"></menu-item>
    </li>
  </ul>
</template>

<script>
export default {
  name: 'MenuItem',
  props: {
    menuData: Array
  }
}
</script>

数据结构设计

合理的菜单数据结构是基础,推荐使用嵌套对象形式:

const menuData = [
  {
    id: 1,
    name: '一级菜单',
    children: [
      {
        id: 11,
        name: '二级菜单',
        children: [...]
      }
    ]
  }
]

动态样式处理

为不同层级菜单添加样式差异,增强用户体验:

vue  实现多级菜单

ul {
  list-style: none;
  padding-left: 20px;
}

li {
  cursor: pointer;
  padding: 5px 10px;
}

li:hover {
  background-color: #f0f0f0;
}

状态管理

使用Vuex或Pinia管理菜单展开/折叠状态:

// store.js
export const useMenuStore = defineStore('menu', {
  state: () => ({
    expandedItems: []
  }),
  actions: {
    toggleExpand(id) {
      const index = this.expandedItems.indexOf(id)
      if (index > -1) {
        this.expandedItems.splice(index, 1)
      } else {
        this.expandedItems.push(id)
      }
    }
  }
})

路由集成

将菜单与Vue Router集成,实现导航功能:

vue  实现多级菜单

const routes = [
  {
    path: '/products',
    component: Products,
    children: [
      {
        path: 'category',
        component: Category
      }
    ]
  }
]

性能优化

对于大型菜单数据,可采用虚拟滚动技术:

<template>
  <RecycleScroller
    :items="flattenedMenuData"
    :item-size="50"
    key-field="id"
  >
    <template #default="{ item }">
      <div :style="{ paddingLeft: `${item.level * 20}px` }">
        {{ item.name }}
      </div>
    </template>
  </RecycleScroller>
</template>

响应式设计

添加移动端适配处理:

@media (max-width: 768px) {
  .menu-container {
    position: fixed;
    top: 0;
    left: 0;
    width: 80%;
    height: 100vh;
    background: white;
    transform: translateX(-100%);
    transition: transform 0.3s ease;
  }

  .menu-container.active {
    transform: translateX(0);
  }
}

无障碍支持

增强菜单的可访问性:

<li 
  role="menuitem"
  :aria-expanded="isExpanded(item.id)"
  @keydown.enter="toggleExpand(item.id)"
>
  {{ item.name }}
</li>

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

相关文章

vue实现轮询

vue实现轮询

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

vue实现功能

vue实现功能

Vue 功能实现方法 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现常见功能的几种方法: 数据绑定与响应式更新 在 Vue 中,数据绑定通过 v-model…

vue实现tablegrid

vue实现tablegrid

Vue 实现 TableGrid 的方法 使用 Element UI 的 Table 组件 Element UI 提供了强大的 Table 组件,可以快速实现表格布局。安装 Element UI 后,…

vue实现slot

vue实现slot

Vue 中的 Slot 实现方法 Vue 的 slot 是一种内容分发机制,允许父组件向子组件插入内容。以下是几种常见的 Slot 实现方式: 默认 Slot 子组件通过 <slot>…

vue实现答辩

vue实现答辩

Vue 实现答辩系统的关键步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目,安装 Vue Router 管理路由,Pinia/Vuex 进行状态管理。配置 ESLint 和 Pre…

vue实现computed

vue实现computed

Vue 中 computed 的实现原理 computed 属性是 Vue 的一个核心特性,它基于响应式依赖进行缓存,仅在依赖发生变化时重新计算。以下是 computed 的实现方式: 基本用法 在…