当前位置:首页 > 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
分享给朋友:

相关文章

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…

vue实现双向

vue实现双向

Vue 实现双向绑定的方法 Vue 的双向绑定主要通过 v-model 指令实现,它结合了数据绑定和事件监听,适用于表单元素(如 input、select、textarea 等)。以下是几种常见的实现…

vue 绑定实现

vue 绑定实现

Vue 绑定实现 Vue 提供了多种数据绑定的方式,包括文本插值、属性绑定、事件绑定、双向绑定等。以下是常见的绑定实现方法: 文本插值 使用双大括号 {{ }} 进行文本插值,将数据动态渲染到 DO…

vue 实现赋值

vue 实现赋值

Vue 实现赋值的方法 在 Vue 中,赋值操作通常涉及数据绑定和响应式更新。以下是几种常见的赋值方式: 直接赋值给 data 属性 在 Vue 实例的 data 对象中定义的属性可以直接通过 th…

vue模版实现

vue模版实现

Vue 模板实现方法 Vue 模板是 Vue.js 的核心特性之一,用于声明式地将 DOM 绑定至底层 Vue 实例的数据。以下是几种常见的 Vue 模板实现方式: 单文件组件(SFC) 使用 .v…

vue实现图片循环

vue实现图片循环

实现图片循环的基本方法 在Vue中实现图片循环通常使用v-for指令结合数组数据。以下是基础实现方式: <template> <div> <img v-fo…