当前位置:首页 > VUE

vue组件实现折叠菜单

2026-02-21 02:58:48VUE

Vue 组件实现折叠菜单

基础实现方法

使用 Vue 的 v-ifv-show 控制菜单显隐,结合点击事件切换状态。示例代码:

vue组件实现折叠菜单

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

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

动态子菜单实现

通过递归组件实现多级嵌套菜单:

vue组件实现折叠菜单

<template>
  <div>
    <div 
      v-for="item in menuItems" 
      :key="item.title"
      class="menu-item"
    >
      <div @click="toggleSubMenu(item)">
        {{ item.title }}
        <span v-if="item.children">{{ item.isOpen ? '-' : '+' }}</span>
      </div>
      <div v-show="item.isOpen && item.children">
        <MenuComponent :menuItems="item.children" />
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'MenuComponent',
  props: ['menuItems'],
  methods: {
    toggleSubMenu(item) {
      if (item.children) {
        item.isOpen = !item.isOpen
      }
    }
  }
}
</script>

动画效果优化

添加过渡动画使折叠更平滑:

<template>
  <div>
    <button @click="toggle">Toggle</button>
    <transition name="slide">
      <div v-show="isOpen" class="menu-content">
        <!-- 菜单内容 -->
      </div>
    </transition>
  </div>
</template>

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

组件封装建议

  1. 通过 props 接收菜单数据
  2. 使用插槽允许自定义菜单项样式
  3. 提供事件钩子如 @open@close
  4. 支持键盘导航功能

完整组件示例:

<template>
  <div class="collapse-menu">
    <div 
      class="menu-header"
      @click="toggle"
      @keydown.enter="toggle"
      tabindex="0"
    >
      <slot name="header">{{ title }}</slot>
      <span class="arrow">{{ isOpen ? '▼' : '▶' }}</span>
    </div>
    <transition name="menu">
      <div v-show="isOpen" class="menu-body">
        <slot></slot>
      </div>
    </transition>
  </div>
</template>

<script>
export default {
  props: {
    title: String,
    isOpen: {
      type: Boolean,
      default: false
    }
  },
  methods: {
    toggle() {
      this.$emit('update:isOpen', !this.isOpen)
    }
  }
}
</script>

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

相关文章

css制作tab菜单

css制作tab菜单

CSS制作Tab菜单的方法 HTML结构 使用无序列表和div容器构建基础结构,列表项为标签页标题,div内放置对应内容块。 <ul class="tab-menu"> <li…

实现vue组件

实现vue组件

创建 Vue 组件 Vue 组件可以通过单文件组件(.vue 文件)或直接在 JavaScript 中定义。以下是两种常见实现方式。 单文件组件方式 单文件组件包含模板、脚本和样式三部分,适合复杂项…

css制作菜单

css制作菜单

CSS 制作菜单的方法 使用 CSS 可以制作多种风格的菜单,包括水平菜单、垂直菜单、下拉菜单等。以下是几种常见的实现方式。 水平菜单 水平菜单通常用于导航栏,可以通过 display: inlin…

uniapp组件

uniapp组件

uniapp组件基础概念 uniapp的组件系统基于Vue.js,支持跨平台开发(H5、小程序、App等)。组件分为内置基础组件(如<view>、<button>)和自定义组件…

vue实现水印组件

vue实现水印组件

Vue 水印组件的实现方法 使用Canvas绘制水印 在Vue组件中通过Canvas动态生成水印图案,将其作为背景添加到目标元素上。 <template> <div ref="…

vue抽屉组件实现

vue抽屉组件实现

Vue 抽屉组件实现 使用 Element UI 实现 Element UI 提供了现成的抽屉组件 el-drawer,可以快速实现抽屉效果。 安装 Element UI: npm install…