下面我给你 3 种正确做法 ,从 最推荐 → 最简单。
✅ 方案一(✅ 最推荐):v-if 彻底移除 aside
✅ 核心思想
关闭时直接销毁组件,不占 DOM 空间
示例代码
vue
<template>
<el-container>
<el-header>Header</el-header>
<el-container>
<!-- 侧边栏 -->
<el-aside v-if="showAside" width="200px">
<Menu />
</el-aside>
<!-- 主内容区 -->
<el-main>
<el-button @click="toggleAside">
{{ showAside ? '关闭' : '打开' }} Aside
</el-button>
</el-main>
</el-container>
</el-container>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const showAside = ref(true)
const toggleAside = () => {
showAside.value = !showAside.value
}
</script>
✅ 优点
- 不占布局
- 不占 DOM
- 最干净、最安全
✅ 方案二(常用):动态 width + overflow
✅ 核心思想
通过
width控制是否占位
vue
<el-aside :width="showAside ? '200px' : '0px'" style="overflow: hidden;">
<Menu />
</el-aside>
JS
ts
const showAside = ref(true)
✅ 适合
- 有动画过渡
- 不想频繁销毁组件
⚠️ 注意
- 必须加
overflow: hidden - 否则内容仍可见
✅ 方案三(动画版):CSS Transition
vue
<el-aside
:width="showAside ? '200px' : '0px'"
class="aside-transition"
>
<Menu />
</el-aside>
css
.aside-transition {
transition: width 0.3s ease;
overflow: hidden;
}
✅ 用户体验最好
❌ 常见错误(你很可能踩过)
❌ 只改 visible
vue
<el-aside :visible="showAside">
👉 Element Plus 的 el-aside 没有 visible 属性
❌ 只控制内部内容
vue
<el-aside>
<Menu v-if="showAside" />
</el-aside>
👉 aside 本身仍然占 200px
✅ 企业后台最推荐结构
vue
<el-container class="app-wrapper">
<el-aside v-if="sidebarOpened" class="sidebar-container">
<Menu />
</el-aside>
<el-container class="main-container">
<el-header>Header</el-header>
<el-main><RouterView /></el-main>
</el-container>
</el-container>
配合:
ts
const sidebarOpened = ref(true)
✅ 一句话总结
✅ 想完全不占位:用
v-if✅ 想要动画:动态
width + transition❌ 不要指望 el-aside 自动消失
如果你愿意,我可以下一步帮你:
- ✅ 写一个 响应式侧边栏(PC / 移动端)
- ✅ 对接 Vue Router 菜单高亮
- ✅ 做一个 Element Plus 后台布局模板
你现在是 PC 后台 / 移动端 / 混合项目?