当前位置:首页 > VUE

vue组件实现折叠菜单

2026-01-20 10:56:08VUE

实现折叠菜单的步骤

使用 Vue 的 v-showv-if 控制菜单显示

在 Vue 组件中,可以通过 v-showv-if 指令来控制菜单的显示与隐藏。v-show 通过 CSS 的 display 属性切换,适合频繁切换的场景;v-if 会销毁和重建 DOM,适合不频繁切换的场景。

<template>
  <div>
    <button @click="toggleMenu">Toggle Menu</button>
    <div v-show="isMenuVisible">
      <ul>
        <li>Menu Item 1</li>
        <li>Menu Item 2</li>
        <li>Menu Item 3</li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isMenuVisible: false
    };
  },
  methods: {
    toggleMenu() {
      this.isMenuVisible = !this.isMenuVisible;
    }
  }
};
</script>

添加过渡动画效果

通过 Vue 的 <transition> 组件可以为折叠菜单添加平滑的动画效果。使用 CSS 过渡或动画类名实现展开和折叠的动画。

vue组件实现折叠菜单

<template>
  <div>
    <button @click="toggleMenu">Toggle Menu</button>
    <transition name="slide">
      <div v-show="isMenuVisible" class="menu">
        <ul>
          <li>Menu Item 1</li>
          <li>Menu Item 2</li>
          <li>Menu Item 3</li>
        </ul>
      </div>
    </transition>
  </div>
</template>

<style>
.slide-enter-active, .slide-leave-active {
  transition: max-height 0.5s ease;
}
.slide-enter-from, .slide-leave-to {
  max-height: 0;
  overflow: hidden;
}
.slide-enter-to, .slide-leave-from {
  max-height: 500px;
}
</style>

使用动态组件实现多级菜单

对于多级折叠菜单,可以通过递归组件或动态组件的方式实现。每个子菜单可以作为一个独立的组件,通过 v-for 动态渲染。

<template>
  <div>
    <div v-for="item in menuItems" :key="item.id">
      <div @click="toggleSubMenu(item)">
        {{ item.title }}
        <span v-if="item.children">{{ item.isOpen ? '−' : '+' }}</span>
      </div>
      <transition name="slide">
        <div v-show="item.isOpen && item.children">
          <ul>
            <li v-for="child in item.children" :key="child.id">{{ child.title }}</li>
          </ul>
        </div>
      </transition>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      menuItems: [
        {
          id: 1,
          title: 'Menu 1',
          isOpen: false,
          children: [
            { id: 11, title: 'Submenu 1' },
            { id: 12, title: 'Submenu 2' }
          ]
        },
        {
          id: 2,
          title: 'Menu 2',
          isOpen: false,
          children: [
            { id: 21, title: 'Submenu 3' }
          ]
        }
      ]
    };
  },
  methods: {
    toggleSubMenu(item) {
      item.isOpen = !item.isOpen;
    }
  }
};
</script>

使用第三方库简化实现

vue组件实现折叠菜单

如果需要更复杂的功能(如手风琴效果、多级嵌套等),可以使用第三方库如 vue-accessible-accordionelement-ui 的折叠面板组件。

安装 element-ui

npm install element-ui

使用 el-collapse 组件:

<template>
  <el-collapse v-model="activeNames">
    <el-collapse-item title="Menu 1" name="1">
      <div>Menu Item 1</div>
      <div>Menu Item 2</div>
    </el-collapse-item>
    <el-collapse-item title="Menu 2" name="2">
      <div>Menu Item 3</div>
    </el-collapse-item>
  </el-collapse>
</template>

<script>
export default {
  data() {
    return {
      activeNames: ['1']
    };
  }
};
</script>

注意事项

  • 如果菜单内容较多,使用 max-height 过渡动画比直接操作 height 更灵活。
  • 多级菜单时,注意管理每个子菜单的状态(如 isOpen),避免状态混乱。
  • 使用第三方库时,注意按需引入以减小打包体积。

标签: 组件菜单
分享给朋友:

相关文章

css制作二级菜单

css制作二级菜单

使用纯CSS制作二级菜单 通过CSS的:hover伪类和子选择器实现二级菜单的显示与隐藏。以下是一个典型的结构和样式示例: HTML结构 <nav class="menu"> &l…

jquery 菜单

jquery 菜单

jQuery 菜单实现方法 使用 jQuery 创建动态菜单可以通过多种方式实现,以下是几种常见的方法: 基于 HTML 和 CSS 的基础结构 创建菜单的 HTML 结构通常使用无序列表 <…

vue实现菜单定位

vue实现菜单定位

Vue实现菜单定位的方法 使用scrollIntoView方法 通过监听菜单点击事件,获取目标元素的DOM节点,调用scrollIntoView方法实现平滑滚动定位。需配合ref获取DOM节点。 m…

vue实现广告组件

vue实现广告组件

vue实现广告组件的方法 使用动态组件实现 在Vue中可以通过动态组件的方式加载广告组件,根据不同的条件展示不同的广告内容。动态组件使用<component :is="currentCompon…

如何设计react组件

如何设计react组件

设计 React 组件的核心原则 React 组件的设计需要遵循高内聚、低耦合的原则,确保组件功能独立且易于维护。组件的设计可以分为展示组件和容器组件两类,展示组件负责 UI 渲染,容器组件负责逻辑处…

vue radio组件实现

vue radio组件实现

Vue Radio 组件实现 在 Vue 中实现 Radio 组件可以通过原生 HTML 的 <input type="radio"> 结合 Vue 的响应式特性来完成。以下是几种常见的实…