当前位置:首页 > 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实现store

vue实现store

Vue 实现 Store 在 Vue 中,可以通过 Vuex 或 Pinia 实现全局状态管理(Store)。以下是两种主流方案的实现方法。 使用 Vuex 实现 Store Vuex 是 Vue…

vue 实现blog

vue 实现blog

Vue 实现博客的基本步骤 使用 Vue 实现博客可以分为前端和后端两部分,前端使用 Vue.js 框架,后端可以选择 Node.js、Python 或其他服务端语言。以下是一个基于 Vue 的博客实…

vue广告实现

vue广告实现

Vue 广告实现方法 在 Vue 项目中实现广告功能可以通过多种方式完成,具体取决于广告类型和需求。以下是几种常见的实现方法: 使用第三方广告平台 许多广告平台如 Google AdSense、百…

vue实现盖章

vue实现盖章

Vue 实现盖章功能 在Vue中实现盖章功能通常涉及前端UI交互,通过Canvas或SVG绘制印章,并允许用户拖拽或点击放置印章。以下是具体实现方法: 使用Canvas绘制印章 通过HTML5的Ca…

vue实现hover

vue实现hover

Vue 实现 hover 效果的方法 在 Vue 中实现 hover 效果可以通过多种方式实现,包括使用 CSS、Vue 指令或事件监听。以下是几种常见的方法: 使用 CSS :hover 伪类 通…

vue实现图片

vue实现图片

Vue 实现图片功能的方法 静态图片引入 在 Vue 项目中,可以通过 src 属性直接引入静态图片。图片通常放在 public 或 assets 目录下。 <template> &…