elementplus实现左侧菜单栏收缩与展开

1.页面结构

Home.vue下包含aside.vue和menu.vue

2.TAside.vue el-menu左侧菜单栏显示

注意:

  1. 要使用收缩与展开,el-aside必须设置width="collapse",否则收缩展开会出现收缩后,el-aside宽度不变窄
  2. 需要使用动态改变展开收缩值 :collapse="isCollapse"
  3. @open="handleOpen"展开后改变isCollapse的值(@close="handleClose"不生效也不影响效果)
  4. :collapse-transition="false"关闭动画效果
  5. el-menu-item中的菜单项必须放在template中,且solt为title否则,展开收缩的会不包含菜单文字<template #title>{{menu.authName}}</template>
  6. 必须设置.el-menu-vertical-demo:not(.el-menu--collapse)样式
html 复制代码
  <el-aside width="collapse">
    <el-scrollbar>
      <div v-bind="menuContent">
        <el-menu
          :default-active="$route.path"
          :collapse="isCollapse"
          class="el-menu-vertical-demo"
          @open="handleOpen"
          :collapse-transition="false"
          router
          active-text-color="#ffd04b"
          background-color="#545c64"
          text-color="#fff"
        >
          <!-- 根据后端返回rights数据渲染菜单 -->
          <el-menu-item :index="menu.path" v-for="menu in showMenuList" :key="menu.id">
            <el-icon v-if="menu.icon">
              <component :is="iconMapping[menu.icon]" />
            </el-icon>
            <template #title>{{menu.authName}}</template>
          </el-menu-item>
        </el-menu>
      </div>
    </el-scrollbar>
  </el-aside>

<script setup>
import { ref,  inject } from "vue";
// 设置菜单栏可折叠
const isCollapse = inject('isCollapse', ref(false))
const handleOpen = (key, keyPath) => {
  isCollapse.value = false;
};
</script>

<style>
.el-menu-vertical-demo:not(.el-menu--collapse){
  width: 200px;
  min-height: 400px;
}
</style>

3.TMain.vue中设置展开收缩按钮

html 复制代码
    <div class="tab-box">
      <!-- 折叠菜单 -->
      <div class="collapse-btn" @click="collapseNav">
        <el-icon>
          <Fold />
        </el-icon>
      </div>
      <!-- 选项卡 -->
      <el-tabs></el-tabs>
....
<script setup>
import { ref,inject } from "vue";
// 设置菜单栏可折叠
const isCollapse = inject('isCollapse', ref(false))
const collapseNav = () =>{
  isCollapse.value = !isCollapse.value;
}
</script>

<style>
.tab-box {
  display: flex;
}

.collapse-btn {
  font-size: 24px;
  margin-right: 10px;
  color: #545c64;
  padding-top: 6px;
}
</style>

4.TAside.vue和TMain.vue页面共享的isCollapse

isCollapse有两个页面的父级页面Home.vue通过provide注入响应式数据后 ,子页面inject获取,更改后也会具有响应性

javascript 复制代码
import { provide, ref} from 'vue'
// 组合式API引入后可以直接使用,不需要再到components中引入
import TAside from '@/components/TAside.vue'
import TMain from '@/components/TMain.vue'
// 注入左侧菜单栏显示与否值
const isCollapse = ref(false);
provide("isCollapse", isCollapse);

5.效果

相关推荐
Sheldon一蓑烟雨任平生1 小时前
Vue3 重构待办事项(主要练习组件化)
vue.js·重构·vue3·组件化练习
zuo-yiran5 小时前
vue div标签可输入状态下实现数据双向绑定
前端·javascript·vue.js
qq_316837755 小时前
使用leader-line-vue 时垂直元素间距过小连线打转的解决
前端·javascript·vue.js
abiao19815 小时前
VUE的“单向数据绑定” 和 “双向数据绑定”
前端·javascript·vue.js
麦麦大数据6 小时前
F042 A星算法课程推荐(A*算法) | 课程知识图谱|课程推荐vue+flask+neo4j B/S架构前后端分离|课程知识图谱构造
vue.js·算法·知识图谱·neo4j·a星算法·路径推荐·课程推荐
拉不动的猪6 小时前
多窗口数据实时同步常规方案举例
前端·javascript·vue.js
南清的coding日记7 小时前
Java 程序员的 Vue 指南 - Vue 万字速览(01)
java·开发语言·前端·javascript·vue.js·css3·html5
Xiaouuuuua7 小时前
2026年计算机毕业设计项目合集
前端·vue.js·课程设计
shawn_yang7 小时前
实现公历和农历日期选择组件(用于选择出生日期)
vue.js·vant
一道雷9 小时前
🚀 Vue Router 插件系统:让路由扩展变得简单优雅
前端·javascript·vue.js