当前位置:首页 > VUE

vue实现折叠菜单

2026-03-08 10:00:07VUE

实现折叠菜单的基本思路

使用Vue的动态组件和条件渲染特性,结合CSS过渡效果实现折叠菜单功能。核心是通过v-show或v-if控制子菜单的显示/隐藏,搭配点击事件切换状态。

数据准备

在Vue组件的data中定义菜单结构和展开状态:

data() {
  return {
    menus: [
      {
        title: '菜单1',
        isOpen: false,
        children: [
          { title: '子菜单1-1' },
          { title: '子菜单1-2' }
        ]
      },
      {
        title: '菜单2',
        isOpen: false,
        children: [
          { title: '子菜单2-1' },
          { title: '子菜单2-2' }
        ]
      }
    ]
  }
}

模板结构

<div class="menu-container">
  <div 
    v-for="(menu, index) in menus"
    :key="index"
    class="menu-item"
  >
    <div 
      class="menu-title"
      @click="toggleMenu(menu)"
    >
      {{ menu.title }}
      <span class="arrow">{{ menu.isOpen ? '▼' : '▶' }}</span>
    </div>

    <transition name="slide">
      <div v-show="menu.isOpen" class="submenu">
        <div 
          v-for="(subItem, subIndex) in menu.children"
          :key="subIndex"
          class="submenu-item"
        >
          {{ subItem.title }}
        </div>
      </div>
    </transition>
  </div>
</div>

切换逻辑

methods: {
  toggleMenu(menu) {
    menu.isOpen = !menu.isOpen
  }
}

过渡样式

.slide-enter-active, .slide-leave-active {
  transition: all 0.3s ease;
  max-height: 500px;
  overflow: hidden;
}

.slide-enter, .slide-leave-to {
  max-height: 0;
  opacity: 0;
}

.menu-title {
  cursor: pointer;
  padding: 10px;
  background: #f5f5f5;
  display: flex;
  justify-content: space-between;
}

.submenu-item {
  padding: 8px 15px;
  background: #fff;
}

使用第三方库

对于更复杂的需求,可以考虑使用现成的Vue组件库:

  1. Element UIel-menu组件内置折叠功能

    <el-menu :collapse="isCollapse">
    <el-submenu index="1">
     <template slot="title">导航1</template>
     <el-menu-item index="1-1">选项1</el-menu-item>
    </el-submenu>
    </el-menu>
  2. Ant Design Vuea-menu组件支持折叠

    <a-menu mode="inline" :inline-collapsed="collapsed">
    <a-sub-menu key="sub1">
     <span slot="title">导航1</span>
     <a-menu-item key="1">选项1</a-menu-item>
    </a-sub-menu>
    </a-menu>

性能优化

对于大型菜单树,建议:

vue实现折叠菜单

  • 使用虚拟滚动技术处理大量菜单项
  • 对深层嵌套菜单进行懒加载
  • 使用Vue的keep-alive缓存已展开的菜单状态

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

相关文章

vue实现摘要

vue实现摘要

Vue 实现摘要的方法 在 Vue 中实现文本摘要功能通常涉及截取文本的前部分内容并添加省略号。可以通过计算属性、过滤器或自定义指令来实现。 计算属性实现 在 Vue 组件中定义一个计算属性,用于截…

vue实现积分

vue实现积分

Vue 实现积分功能 在 Vue 中实现积分功能通常涉及前端展示、交互逻辑以及与后端 API 的通信。以下是常见的实现方法和步骤: 积分展示组件 创建一个积分展示组件,用于显示当前用户的积分。可以使…

实现 vue ssr

实现 vue ssr

Vue SSR 实现方法 Vue SSR(Server-Side Rendering)通过服务器端渲染 Vue 应用,提升首屏加载速度和 SEO 友好性。以下是核心实现方法: 基础配置 安装必要依赖…

vue实现erp

vue实现erp

Vue实现ERP系统的关键步骤 技术选型与架构设计 采用Vue 3 + TypeScript构建前端,搭配Pinia状态管理,Element Plus或Ant Design Vue作为UI框架。后端可…

vue实现换行

vue实现换行

Vue 中实现换行的几种方法 在 Vue 中实现换行可以通过多种方式,具体取决于使用场景和需求。以下是常见的几种方法: 使用 HTML 的 <br> 标签 在模板中直接使用 <br…

vue diff实现

vue diff实现

Vue Diff 算法实现原理 Vue 的虚拟 DOM Diff 算法(即 patch 过程)是其高效渲染的核心,主要通过对比新旧虚拟节点的差异,最小化 DOM 操作。以下是关键实现要点: 同层级比…