vue 学习笔记 【ElementPlus】el-menu 折叠后图标不见了

在Vue应用中,当菜单折叠后出现图标丢失的现象。问题出在el-icon元素在title模板内的使用。解决方法是将el-icon移出#title,但el-sub-menu的情况需保持el-icon在内,否则显示异常。调整后的代码使菜单项在展开和折叠状态下均能正确显示图标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目当前版本

{
  
  "dependencies": {
    "@element-plus/icons-vue": "^2.1.0",
    "@types/js-cookie": "^3.0.3",
    "@types/nprogress": "^0.2.0",
    "axios": "^1.4.0",
    "core-js": "^3.8.3",
    "element-plus": "^2.3.8",
    "js-cookie": "^3.0.5",
    "nprogress": "^0.2.0",
    "path-browserify": "^1.0.1",
    "svg-sprite-loader": "^6.0.11",
    "vue": "^3.2.13",
    "vue-router": "^4.0.3",
    "vuex": "^4.0.0"
  },
}

运行过程中,菜单折叠后,图标不见了

<template>
  <template v-if="haspurview(item)">
    <!-- <template v-if="!item.hidden || item.hidden !== true"> -->
    <el-menu-item
      v-if="hasChild(item) == 0"
      :index="resolvePath(item.path)"
      :key="resolvePath(item.path)"
    >
      <template #title>
        <el-icon>
          <component :is="item.meta?.icon" />
        </el-icon>
        <span>{{ item.meta?.title }}</span>
      </template>
    </el-menu-item>

    <!-- <template v-else-if="hasChild(item) == 1 && item.meta?.menuup"> -->

    <el-menu-item
      v-if="hasChild(item) == 1"
      :index="resolvePath(onlyOneChild.path)"
      :key="resolvePath(onlyOneChild.path)"
    >
      <template #title>
        <el-icon>
          <component :is="onlyOneChild.meta?.icon" />
        </el-icon>
        <span>{{ onlyOneChild.meta?.title }}</span>
      </template>
    </el-menu-item>

    <el-sub-menu
      v-if="hasChild(item) > 1"
      :index="resolvePath(item.path)"
      :key="resolvePath(item.path)"
    >
      <template #title>
        <el-icon v-if="item.meta?.icon">
          <component :is="item.meta?.icon" />
        </el-icon>
        <span>{{ item.meta?.title }}</span>
      </template>
      <MenuItem
        v-for="child in item.children"
        :key="child.path"
        :item="child"
      />
    </el-sub-menu>
  </template>
</template>

在这里插入图片描述
图标不见了
在这里插入图片描述

解决办法是
把el-icon 从#title 中提取出来

    <el-menu-item
      v-if="hasChild(item) == 0"
      :index="resolvePath(item.path)"
      :key="resolvePath(item.path)"
    >
      <el-icon>
        <component :is="item.meta?.icon" />
      </el-icon>
      <template #title>
        <span>{{ item.meta?.title }}</span>
      </template>
    </el-menu-item>

运行结果
在这里插入图片描述
el-icon 还是要放于#title里,否则显示不正常

<el-sub-menu
      v-if="hasChild(item) > 1"
      :index="resolvePath(item.path)"
      :key="resolvePath(item.path)"
    >
      <template #title>
        <el-icon v-if="item.meta?.icon">
          <component :is="item.meta?.icon" />
        </el-icon>
        <span>{{ item.meta?.title }}</span>
      </template>
### 实现 `el-aside` 组件的折叠效果 为了实现 `el-aside` 的折叠效果,可以利用 Element UI 提供的功能来动态调整侧边栏的状态。具体来说,在 Vue 中可以通过绑定属性和事件处理函数来控制 `el-aside` 和其内部组件的行为。 #### 使用 `v-model` 控制折叠状态 通过给 `<el-menu>` 添加 `collapse` 属性并与父级作用域中的数据项双向绑定,能够轻松切换菜单的展开与收起模式: ```html <template> <div class="layout"> <!-- 外部容器 --> <el-container style="height: 100%;"> <!-- 左侧导航栏 --> <el-aside :style="{ width }" @mouseenter="handleMouseEnter()" @mouseleave="handleMouseLeave()"> <el-menu :default-active="$route.path" router unique-opened background-color="#545c64" text-color="#fff" active-text-color="#ffd04b" :collapse="isCollapse"> <!-- 菜单项... --> </el-menu> </el-aside> <!-- 主要内容区 --> <el-main>Main Content</el-main> </el-container> </div> </template> <script> export default { data() { return { isCollapse: false, asideWidthExpanded: '200px', asideWidthCollapsed: '64px' }; }, computed: { width() { return this.isCollapse ? this.asideWidthCollapsed : this.asideWidthExpanded; } }, methods: { handleMouseEnter(){ if (this.isCollapse){ setTimeout(() => { this.isCollapse = !this.isCollapse }, 300); } }, handleMouseLeave(){ if (!this.isCollapse){ setTimeout(() => { this.isCollapse = !this.isCollapse }, 300); } } } }; </script> <style scoped> .layout .el-aside { transition: all .3s ease-in-out; } </style> ``` 上述代码展示了如何创建一个响应式的左侧菜单栏[^1]。当鼠标悬停于侧边栏上时触发展开操作;移开后自动恢复到初始大小。同时设置了过渡动画使得变化更加平滑自然[^2]。 另外需要注意的是,如果希望在折叠状态下隐藏文字只保留图标,则可以在样式表里针对 `.el-submenu__title span` 及其他相关类名应用条件显示逻辑[^3]。 最后提醒一点,对于某些特殊情况下的布局问题(比如宽度随内容改变),可能还需要额外配置 CSS 或者 JavaScript 来确保最佳用户体验[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值