当前位置:首页 > VUE

vue组件实现折叠菜单

2026-02-21 02:58:48VUE

Vue 组件实现折叠菜单

基础实现方法

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

<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>

动态子菜单实现

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

<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. 支持键盘导航功能

完整组件示例:

vue组件实现折叠菜单

<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>

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

相关文章

vue实现菜单定位

vue实现菜单定位

实现菜单定位的方法 在Vue中实现菜单定位功能,可以通过监听滚动事件或使用Intersection Observer API来判断当前显示的菜单项,并高亮对应的导航链接。以下是几种常见的实现方式:…

jquery 菜单

jquery 菜单

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

vue表格组件实现

vue表格组件实现

Vue表格组件实现 基础表格实现 使用el-table组件实现基础表格功能。安装Element UI后,引入el-table和el-table-column组件。 <template>…

vue实现分页组件

vue实现分页组件

Vue 分页组件实现 基础分页组件结构 创建一个名为 Pagination.vue 的文件,包含以下基础模板和逻辑: <template> <div class="pagina…

实现树形菜单vue

实现树形菜单vue

实现树形菜单的Vue方案 递归组件实现 创建递归组件TreeMenu.vue,通过组件自身调用自身实现无限层级渲染: <template> <ul> <li…

vue组件实现原理

vue组件实现原理

Vue 组件实现原理 Vue 组件的核心实现基于以下机制: 组件注册与模板解析 Vue 组件通过 Vue.component() 或单文件组件(.vue 文件)注册。模板会被编译成渲染函数,最终生成…