vue3、Element-Plus,el-menu,Collapse折叠展开动画显示。组件与组件之间传参

在这里插入图片描述
首先我的head和menu是分开的2个组件,我的控制开关是放到head组件里面的。所以使用了组件之间相互传参的插件mitt,mitt插件的安装放文章最后。

<el-container>
  <el-aside width="auto"><MenuView /></el-aside>
  <el-container>
    <el-header><HeadView /></el-header>
    <el-main>
      <router-view></router-view>
    </el-main>
  </el-container>
</el-container>

重点:el-aside必须加width=“auto”

以下是menu页面需要添加的代码

<el-menu
    default-active="1"
    class="el-menu-container"
    :collapse="isCollapse"	// 这是监控菜单的折叠,默认false。为true就是缩进,false就是展开。动画默认开启的,也可以关闭。具体去查看文档
    :unique-opened=true
    background-color="#304156"
    text-color="#FFFFFF"
    active-text-color="#409eff"
    @open="handleOpen"
    @close="handleClose"
    >
    <el-menu-item index="0">	// 把logo放到menu里面是觉得方便,不需要修改class。不喜欢的这里可以删除
        <el-icon v-if="isCollapse"><HelpFilled /></el-icon>	// isCollapse为true是缩进显示图标不显示文字,展开显示文字不显示图标
        <template #title>
          <div class="jsoText">Jsocc</div>
        </template>
      </el-menu-item>
    <router-link to="/main">
      <el-menu-item index="1">
        <el-icon><ElementPlus /></el-icon>
        <template #title>
        	首页
        </template>
      </el-menu-item>
    </router-link>
</el-menu>
.....中间省略
// 在当前文件下里面
<script lang="ts" setup>
const isCollapse = ref(false)
.....中间省略
<style lang="scss" scoped>
// 重要以下就是添加menu的宽度和高度。
.el-menu-container:not(.el-menu--collapse) {
  width: 200px;
  height: calc(100vh);
}

如果控制开关不是分开组件放
就可以直接在menu里面定义一个按钮

const menuOpen = () => {
	isCollapse.value = !isCollapse.value	// 相互取反,点击true,在点击false
}

这样就可以打开关闭menu了。

下面讲一下组件与组件之间传参,需要用到mitt插件
首先安装mitt

npm install mitt -S

这个插件不能直接使用必须暴露出来才能使用,和element-plus差不多。不过这里我们就不添加全局了。我们写一个utils。在utils里面新建一个eventbus.ts,新建js的也是行的。
代码如下

// mitt库默认导出的是一个函数,我们需要执行它从而得到事件总线的对象
/* eventbus.js */
// 这里我们在js中暴露这个事件总线对象
import mitt from "mitt";
const emitter = mitt();
export default emitter;

然后在head里面引用出来

import emitter from "@/utils/eventbus.ts" //引用刚刚新建的utils文件

const menuL = ref<boolean>(false)	// 建立一个menuL

const cpLeft = () => {	// head里面的图标点击按钮
  menuL.value = !menuL.value	//首先把menuL取反
  menuL.value ? head_icon.value = 'Expand' : head_icon.value = 'Fold'	//这里是改变按钮上面的图标式样
  emitter.emit("sayInfo",menuL.value)	//通过mitt的emit把menuL传递出去,sayInfo传参名称
}

然在到menu页面去接受这个sayInfo传递过来的参数
接收参数必须放到onMounted里面,使用mitt里面on命令获取head传送过来的值
然后把info值直接赋给isCollapse。到这里就可以控制menu里面的collapse了,实现折叠展开

import emitter from "@/utils/eventbus.ts" //menu也要引用刚刚新建的utils文件

onMounted(()=>{
    emitter.on("sayInfo",(info:any)=>{
      isCollapse.value = info
    })
})

OK,结束了
有什么问题请留言,看到后会即使回复。
鄙人新手,有写的不好的地方请包含。

### 修改 Vue3Element-Plus 侧边栏收缩时的背景色 在 Vue3Element-Plus 的项目中,可以通过 CSS 深度选择器 `::v-deep` 或者新的语法 `:deep()` 来覆盖组件内部样式。以下是实现修改侧边栏折叠时背景色的具体方法。 #### 使用深度选择器覆盖默认样式 通过添加以下代码到项目的全局样式文件或者特定组件的 `<style>` 块中: ```css /* 覆盖展开状态下菜单的背景色 */ :deep(.el-menu) { background-color: transparent !important; /* 设置透明或其他颜色 */ } /* 自定义折叠状态下的宽度和背景色 */ :deep(.el-menu--collapse) { width: 10px; /* 折叠后的宽度 */ background-color: #your-desired-color !important; /* 替换为你想要的颜色 */ } ``` 上述代码片段分别设置了 `.el-menu` 展开状态下的背景色以及 `.el-menu--collapse` 折叠状态下的宽度背景色[^1][^3]。 #### 在指定组件中引入变量并应用样式 如果需要更灵活地管理样式,可以将这些样式放入单独的 SCSS 文件中,并在目标组件中导入该文件。例如,在 `Sidebar/index.vue` 组件中引入 `src/styles/variables.scss` 并确保其生效[^2]: ```scss // src/styles/variables.scss $sidebar-bg-color-collapsed: #your-desired-color; .el-menu--collapse { background-color: $sidebar-bg-color-collapsed !important; } ``` 然后在 `Sidebar/index.vue` 中使用 `@import` 导入此文件: ```javascript <style lang="scss"> @import &#39;@/styles/variables.scss&#39;; .sidebar-container { :deep(.el-menu--collapse) { background-color: var(--sidebar-bg-color-collapsed) !important; } } </style> ``` #### 修改图标的颜色 对于侧边栏图标颜色的调整,有多种方式可以选择。一种简单的方法是直接设置父容器的 `color` 属性,因为 SVG 图标通常会继承父级的颜色属性;另一种则是显式更改 `fill` 颜色来控制具体的表现效果[^4]。 ```css /* 方法一:统一设置父级 color */ :deep(.el-submenu__icon-arrow), :deep(.el-menu-item i) { color: #desired-icon-color !important; } /* 方法二:针对 fill 进行独立设定 */ :deep(svg path) { fill: #specific-fill-color !important; } ``` 以上两种方案可以根据实际需求任选其一或组合运用。 --- ### 注意事项 当尝试覆写第三方库(如 Element-Plus)自带样式的某些部分时,请务必确认所使用的类名是否完全匹配官方文档描述的内容结构。此外,由于框架版本迭代可能导致 API 变化,建议始终查阅最新版的相关资料以获取最精确的信息支持。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JsoCc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值