当前位置:首页 > VUE

vue实现菜单展开收起

2026-02-24 09:03:18VUE

实现菜单展开收起功能

在Vue中实现菜单的展开收起功能,可以通过以下方法完成:

使用v-show或v-if控制显示隐藏

<template>
  <div>
    <button @click="toggleMenu">切换菜单</button>
    <div v-show="isMenuOpen">
      <!-- 菜单内容 -->
      <ul>
        <li>菜单项1</li>
        <li>菜单项2</li>
        <li>菜单项3</li>
      </ul>
    </div>
  </div>
</template>

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

添加过渡动画效果

<template>
  <div>
    <button @click="toggleMenu">切换菜单</button>
    <transition name="slide">
      <div v-show="isMenuOpen" class="menu">
        <!-- 菜单内容 -->
      </div>
    </transition>
  </div>
</template>

<style>
.slide-enter-active, .slide-leave-active {
  transition: all 0.3s ease;
}
.slide-enter, .slide-leave-to {
  transform: translateX(-100%);
  opacity: 0;
}
.menu {
  background: #f5f5f5;
  padding: 10px;
}
</style>

使用Vuex管理状态(适用于大型应用)

// store.js
export default new Vuex.Store({
  state: {
    isMenuOpen: false
  },
  mutations: {
    toggleMenu(state) {
      state.isMenuOpen = !state.isMenuOpen
    }
  }
})
<template>
  <div>
    <button @click="$store.commit('toggleMenu')">切换菜单</button>
    <div v-show="$store.state.isMenuOpen">
      <!-- 菜单内容 -->
    </div>
  </div>
</template>

递归菜单组件实现多级展开收起

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

<script>
import MenuItem from './MenuItem.vue'

export default {
  components: {
    MenuItem
  },
  data() {
    return {
      menuItems: [
        {
          id: 1,
          name: '菜单1',
          children: [
            { id: 11, name: '子菜单1' },
            { id: 12, name: '子菜单2' }
          ]
        },
        {
          id: 2,
          name: '菜单2',
          children: []
        }
      ]
    }
  }
}
</script>
<!-- MenuItem.vue -->
<template>
  <div>
    <div @click="toggle">
      {{ item.name }}
      <span v-if="hasChildren">{{ isOpen ? '-' : '+' }}</span>
    </div>
    <div v-show="isOpen && hasChildren">
      <menu-item
        v-for="child in item.children"
        :key="child.id"
        :item="child"
      />
    </div>
  </div>
</template>

<script>
export default {
  name: 'MenuItem',
  props: {
    item: Object
  },
  data() {
    return {
      isOpen: false
    }
  },
  computed: {
    hasChildren() {
      return this.item.children && this.item.children.length
    }
  },
  methods: {
    toggle() {
      if (this.hasChildren) {
        this.isOpen = !this.isOpen
      }
    }
  }
}
</script>

响应式设计考虑

vue实现菜单展开收起

/* 移动端适配 */
@media (max-width: 768px) {
  .menu {
    position: fixed;
    top: 0;
    left: 0;
    width: 80%;
    height: 100vh;
    z-index: 100;
  }
  .menu-toggle {
    display: block;
    position: fixed;
    right: 20px;
    top: 20px;
    z-index: 101;
  }
}

以上方法可以根据实际需求选择使用,从简单显示隐藏到复杂多级菜单都能实现,同时考虑了动画效果和响应式设计。

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

相关文章

eventbus vue实现

eventbus vue实现

EventBus 实现原理 EventBus 是一种发布/订阅模式,用于 Vue 组件间的通信。核心是通过一个中央事件总线管理事件监听和触发。 创建 EventBus 在 Vue 项目中创建一个独立…

vue compile 实现

vue compile 实现

Vue 编译实现原理 Vue 的编译过程将模板字符串转换为渲染函数,主要分为解析、优化和代码生成三个阶段。 解析阶段(Parse) 将模板字符串转换为抽象语法树(AST)。Vue 使用正则表达式和有…

vue实现popup

vue实现popup

Vue 实现 Popup 弹窗 使用 Vue 原生组件 创建一个基本的 Vue 组件作为弹窗,通过 v-if 或 v-show 控制显示隐藏。 <template> <div&…

vue实现上传

vue实现上传

Vue 文件上传实现方法 使用 Vue 实现文件上传可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的事件处理和数据绑定来实现。 基础实现步骤…

vue 实现工具

vue 实现工具

Vue 实现工具的方法 使用 Vue 实现工具功能可以通过多种方式完成,具体取决于工具的类型和需求。以下是几种常见的方法: 组件化实现 创建一个独立的 Vue 组件来封装工具功能。例如,实现一个计…

vue watch实现

vue watch实现

在 Vue 中实现 watch 监听数据变化 Vue 的 watch 选项用于监听数据变化并执行相应的回调函数。以下是几种常见的实现方式: 基础用法 export default { data(…