当前位置:首页 > VUE

vue实现折叠菜单

2026-01-15 07:18:11VUE

实现折叠菜单的基本思路

在Vue中实现折叠菜单通常涉及使用组件化开发,结合状态管理控制菜单的展开与折叠。核心是通过v-showv-if动态切换子菜单的显示状态,并通过事件触发(如点击)改变状态。

基础实现代码示例

以下是一个简单的折叠菜单实现,基于Vue 3的<script setup>语法:

<template>
  <div class="menu">
    <div 
      class="menu-item" 
      v-for="item in menuItems" 
      :key="item.id"
      @click="toggleMenu(item.id)"
    >
      <span>{{ item.title }}</span>
      <div class="submenu" v-show="activeMenu === item.id">
        <div 
          class="submenu-item" 
          v-for="subItem in item.children" 
          :key="subItem.id"
        >
          {{ subItem.title }}
        </div>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const menuItems = [
  { id: 1, title: '菜单1', children: [
    { id: 11, title: '子菜单1-1' },
    { id: 12, title: '子菜单1-2' }
  ]},
  { id: 2, title: '菜单2', children: [
    { id: 21, title: '子菜单2-1' },
    { id: 22, title: '子菜单2-2' }
  ]}
];

const activeMenu = ref(null);
const toggleMenu = (id) => {
  activeMenu.value = activeMenu.value === id ? null : id;
};
</script>

<style scoped>
.menu-item {
  cursor: pointer;
  padding: 8px;
  border-bottom: 1px solid #eee;
}
.submenu {
  margin-left: 20px;
}
.submenu-item {
  padding: 6px;
  color: #666;
}
</style>

支持多级嵌套的实现

若需支持多级嵌套菜单,可通过递归组件实现:

vue实现折叠菜单

<template>
  <div class="menu">
    <MenuItem 
      v-for="item in menuItems" 
      :key="item.id" 
      :item="item" 
    />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import MenuItem from './MenuItem.vue';

const menuItems = [
  { 
    id: 1, 
    title: '菜单1', 
    children: [
      { 
        id: 11, 
        title: '子菜单1-1',
        children: [
          { id: 111, title: '三级菜单1-1-1' }
        ]
      }
    ]
  }
];
</script>

MenuItem.vue(递归组件):

<template>
  <div>
    <div class="menu-item" @click="toggleOpen">
      <span>{{ item.title }}</span>
      <span v-if="hasChildren">{{ isOpen ? '−' : '+' }}</span>
    </div>
    <div v-show="isOpen && hasChildren" class="submenu">
      <MenuItem 
        v-for="child in item.children" 
        :key="child.id" 
        :item="child" 
      />
    </div>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue';

const props = defineProps({
  item: Object
});

const isOpen = ref(false);
const hasChildren = computed(() => 
  props.item.children && props.item.children.length > 0
);

const toggleOpen = () => {
  if (hasChildren.value) {
    isOpen.value = !isOpen.value;
  }
};
</script>

动画过渡效果

通过Vue的<transition>组件添加展开/折叠动画:

vue实现折叠菜单

<transition name="slide">
  <div v-show="isOpen && hasChildren" class="submenu">
    <!-- 子菜单内容 -->
  </div>
</transition>

<style scoped>
.slide-enter-active, .slide-leave-active {
  transition: max-height 0.3s ease;
  overflow: hidden;
}
.slide-enter-from, .slide-leave-to {
  max-height: 0;
}
.slide-enter-to, .slide-leave-from {
  max-height: 500px; /* 根据实际内容调整 */
}
</style>

使用第三方库

若需快速实现复杂功能,可考虑以下库:

  • Element Plus:内置<el-menu>组件支持折叠
  • Ant Design Vue:提供<a-menu>组件
  • Vue-Accordion:专注手风琴效果的轻量级库

安装Element Plus示例:

npm install element-plus

使用示例:

<template>
  <el-menu :default-openeds="['1']">
    <el-sub-menu index="1">
      <template #title>菜单1</template>
      <el-menu-item index="1-1">子菜单1</el-menu-item>
    </el-sub-menu>
  </el-menu>
</template>

<script setup>
import { ElMenu, ElMenuItem, ElSubMenu } from 'element-plus';
</script>

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

相关文章

vue 实现全选

vue 实现全选

Vue 实现全选功能 在 Vue 中实现全选功能通常需要结合复选框的状态管理,以下是几种常见的实现方式: 使用 v-model 绑定数组 通过 v-model 绑定一个数组来管理选中的项,全选时将…

vue实现点击样式

vue实现点击样式

Vue 实现点击样式的方法 在 Vue 中实现点击样式可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-bind:class 动态绑定类名 通过数据驱动的方式动态切换类名,结合…

vue实现多级组件

vue实现多级组件

实现多级组件的基本结构 在Vue中实现多级组件通常涉及父子组件嵌套,通过props向下传递数据,通过$emit向上传递事件。多级组件的核心是递归或动态组件渲染。 <!-- 父组件 Paren…

vue实现录播播放

vue实现录播播放

Vue 实现录播播放 使用 video.js 实现 安装 video.js 和相关的 Vue 适配器: npm install video.js @videojs-player/vue 在 Vue…

vue实现适老化样式

vue实现适老化样式

Vue 实现适老化样式的关键方法 全局字体与字号调整 通过 CSS 变量或主题配置统一放大基础字号,建议正文不小于 18px,标题更大。在 App.vue 中设置全局样式: :root { --…

vue实现人脸识别比对

vue实现人脸识别比对

Vue 实现人脸识别比对的方法 使用现成的人脸识别 API 通过调用第三方人脸识别 API(如 Face++、百度 AI、腾讯云等)实现比对功能。注册开发者账号获取 API Key 和 Secret,…