vue实现伸缩菜单
Vue 实现伸缩菜单的方法
使用 v-show 或 v-if 控制显示
通过 Vue 的指令 v-show 或 v-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>
结合 CSS 过渡动画
为了让菜单的伸缩更加平滑,可以结合 Vue 的 <transition> 组件和 CSS 过渡效果。
<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, .slide-leave-to {
max-height: 0;
}
.slide-enter-to, .slide-leave {
max-height: 200px;
}
.menu {
overflow: hidden;
}
</style>
使用 Vuex 管理状态
在大型应用中,可以使用 Vuex 管理菜单的伸缩状态,方便多个组件共享和修改。
// store.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
isMenuVisible: false
},
mutations: {
toggleMenu(state) {
state.isMenuVisible = !state.isMenuVisible;
}
}
});
<template>
<div>
<button @click="toggleMenu">Toggle Menu</button>
<div v-show="$store.state.isMenuVisible">
<ul>
<li>Menu Item 1</li>
<li>Menu Item 2</li>
<li>Menu Item 3</li>
</ul>
</div>
</div>
</template>
<script>
import { mapMutations } from 'vuex';
export default {
methods: {
...mapMutations(['toggleMenu'])
}
};
</script>
动态绑定类名
通过动态绑定类名,可以实现更复杂的样式切换效果。
<template>
<div>
<button @click="toggleMenu">Toggle Menu</button>
<div :class="{ 'menu-collapsed': !isMenuVisible, 'menu-expanded': isMenuVisible }">
<ul>
<li>Menu Item 1</li>
<li>Menu Item 2</li>
<li>Menu Item 3</li>
</ul>
</div>
</div>
</template>
<style>
.menu-collapsed {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
}
.menu-expanded {
max-height: 200px;
overflow: hidden;
transition: max-height 0.3s ease;
}
</style>
使用第三方库
如果需要更复杂的菜单功能,可以考虑使用第三方库如 vue-navigation 或 vue-sidebar-menu。
npm install vue-sidebar-menu
<template>
<div>
<sidebar-menu :menu="menu" :collapsed="isCollapsed" />
<button @click="toggleCollapse">Toggle Collapse</button>
</div>
</template>
<script>
import { SidebarMenu } from 'vue-sidebar-menu';
export default {
components: { SidebarMenu },
data() {
return {
isCollapsed: false,
menu: [
{
title: 'Menu 1',
icon: 'fa fa-home',
child: [
{ title: 'Submenu 1' },
{ title: 'Submenu 2' }
]
},
{ title: 'Menu 2', icon: 'fa fa-user' }
]
};
},
methods: {
toggleCollapse() {
this.isCollapsed = !this.isCollapsed;
}
}
};
</script>
以上方法可以根据实际需求选择适合的方案实现伸缩菜单功能。







