当前位置:首页 > 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 实现好评弹框的方法 使用 Vue 实现好评弹框可以通过组件化方式完成,结合动态数据绑定和事件处理。以下是具体实现步骤: 1. 创建弹框组件 新建一个 RatingDialog.vue 组件…

vue实现本地数据存储

vue实现本地数据存储

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

vue实现suspense

vue实现suspense

Vue 3 中实现 Suspense Suspense 是 Vue 3 引入的一个内置组件,用于处理异步依赖的加载状态。它允许在等待异步组件或异步数据加载时显示一个后备内容(fallback),直到异…

vue 实现后退

vue 实现后退

实现后退功能的方法 在Vue中实现后退功能通常需要结合浏览器历史记录API或Vue Router的导航方法。以下是几种常见的实现方式: 使用Vue Router的go方法 this.$router…

vue实现curd

vue实现curd

Vue实现CRUD操作 初始化Vue项目 使用Vue CLI创建新项目,安装必要依赖如axios用于HTTP请求 vue create crud-demo cd crud-demo npm inst…

vue实现 弹窗

vue实现 弹窗

Vue 实现弹窗的基本方法 使用 Vue 实现弹窗可以通过多种方式,包括组件化、指令、插件等。以下是几种常见的实现方法。 组件化实现弹窗 创建一个独立的弹窗组件,通过 props 控制显示与隐藏。…