Element Plus如何动态切换icon

简介: Element Plus如何动态切换icon

参考资料:

Element Plus最新图标引入以及使用方法,icon动态组件,点击切换图标_@element-plus/icons-vue

vue3 elementplus el-Icon 动态渲染 点击切换icon图标组件_vue3怎样实现点击切换图标?

这里要利用动态组件进行切换,使用一个component组件,之前用ELEMENT-UI想要实现动态切换的写法:这是之前的写法

由于ELEMENTPLUS不能通过改变类名的方式修改icon,这里如何切换呢?

把原先icon的图标用component进行替换

这里的最终解决方案是:利用v-show方法显示和隐藏解决的,先用click绑定一个方法,:is绑定你想要显示icon的内容,然后用v-if 和v-else

          <el-icon @click="handleCollapse">
            <component :is="Fold" v-if="isCollapse"></component>
            <component :is="Expand" v-else></component>
          </el-icon>

Script中一定要引入你的icon才可以

<script setup>
import {
    House,
    Menu,
    Fold
} from '@element-plus/icons-vue'
 
 
</script>

定义一个isCollapse判断显不显示,this顺序很重要,有时候点了一下没反应,按照下面的顺序

<script setup>
 
import { House, Menu, Fold, Expand, ArrowRight} from "@element-plus/icons-vue";
</script>
<script>
export default {
  name: "HomeView",
  data() {
    return {
      isCollapse: false,
      asideWidth: "200px",
      flag:true
    };
  },
  methods: {
    handleCollapse() {
      this.isCollapse = !this.isCollapse; 
      this.asideWidth = this.isCollapse ? "64px" : "200px";
    },
  },
};
</script>

这样就是实现切换了,用了component

附赠源码:

<template>
  <div>
    <el-container>
      <el-aside
        :width="asideWidth"
        style="min-height: 100vh; background-color: #001529"
      >
        <div
          style="
            height: 60px;
            color: white;
            display: flex;
            align-items: center;
            justify-content: center;
          "
        >
          <!-- <img src="@/assets/logo.png" style="width: 60px;height: 10px;">
                    <span class="logo-title" v-show="!isCollapse">零一</span> -->
        </div>
        <el-menu
          :collapse="isCollapse"
          style="border: none"
          background-color="#001529"
          text-color="rgba(255,255,255,0.65)"
          default-active="$router.path"
        >
          <el-menu-item index="/">
            <el-icon>
              <House />
            </el-icon>
            <span>系统首页</span>
          </el-menu-item>
          <el-menu-item>
            <template #title>
              <el-icon>
                <House />
              </el-icon>
              <span>系统首页</span>
            </template>
          </el-menu-item>
          <el-menu-item>
            <template #title>
              <el-icon>
                <House />
              </el-icon>
              <span>系统首页</span>
            </template>
          </el-menu-item>
          <el-sub-menu index="1-4">
            <template #title>
              <el-icon>
                <Menu />
              </el-icon>
              <span>信息管理</span>
            </template>
            <el-menu-item index="1-4-1">用户信息</el-menu-item>
          </el-sub-menu>
        </el-menu>
      </el-aside>
      <el-container>
        <el-header>
          <el-icon @click="handleCollapse">
            <component :is="Expand" v-if="isCollapse"></component>
            <component :is="Fold" v-else></component>
          </el-icon>
          <el-breadcrumb :separator-icon="ArrowRight" style="margin-left:20px">
            <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
            <el-breadcrumb-item :to="{ path: '/' }">用户管理</el-breadcrumb-item>
          </el-breadcrumb>
        </el-header>
        <el-main> </el-main>
      </el-container>
    </el-container>
  </div>
</template>
<style scoped>
.el-menu--inline {
  background-color: #000c17 !important;
}
 
.el-menu--inline .el-menu-item {
  background-color: #000c17 !important;
}
 
.el-menu-item:hover,
.el-sub-menu__title:hover span {
  color: #fff !important;
}
 
.el-sub-menu__title:hover i {
  color: #fff !important;
}
 
.el-menu-item.is-active {
  background-color: #40a9ff !important;
  color: #fff;
  border-radius: 5px !important;
  margin: 4px !important;
  width: calc(100% -8px);
  margin-left: 4px;
}
 
.el-menu-item.is-active i,
.el-menu-item.el-menu-item.is-active .el-tooltip {
  margin-left: -4px;
}
 
.el-menu-item {
  height: 40px !important;
  line-height: 40px !important;
  margin: 4px !important;
}
 
.el-submenu__title {
  height: 40px !important;
  line-height: 40px !important;
  margin: 4px !important;
}
 
.el-aside {
  transition: width .3s;
  box-shadow: 2px 0 6px rgba(0,21,41,.35);
}
.el-header {
  box-shadow: 2px 0 6px rgba(0,21,41,.35);
  display: flex;
  align-items: center;
}
.el-aside div .img {
  width: 30px;
}
.el-aside div span {
  font-size: 14px;
  font-family: "Times New Roman", Times, serif;
  font-weight: 700;
}
.logo-title {
  margin-left: 5px;
  font-size: 20px;
  transition: all 0.3s;
}
</style>
<script setup>
 
import { House, Menu, Fold, Expand, ArrowRight} from "@element-plus/icons-vue";
</script>
<script>
export default {
  name: "HomeView",
  data() {
    return {
      isCollapse: false,
      asideWidth: "200px",
      flag:true
    };
  },
  methods: {
    handleCollapse() {
      this.isCollapse = !this.isCollapse; 
      this.asideWidth = this.isCollapse ? "64px" : "200px";
    },
  },
};
</script>

最后效果:

相关文章
|
存储 资源调度
在 Pinia 中如何实现状态持久化?
在 Pinia 中如何实现状态持久化?
3518 57
|
监控 Ubuntu 测试技术
Ubuntu 20.04 安装部署 TiDB DM v7.3.0 集群【全网独家】
在Ubuntu上搭建TiDB DM集群的详细步骤分享,作者因工作需求克服了部署难题。测试环境包括3台Ubuntu 20.04主机:1台master和2台worker。首先,确保所有主机安装TiDB单机环境,使用TiUP工具下载并部署。接着,设置主机间免密登录,安装必要组件如sudo、systemd、iproute2和DM组件。配置文件可通过在线或离线方式获取。部署时,根据需求编辑`topology.yaml`,然后使用`tiup dm deploy`命令安装。最后,启动集群并检查节点状态,确认DM集群正常运行。注意,解决内存不足和端口连通性问题以避免错误。
1206 3
|
前端开发
前端ElementPlus框架中的几种图标按钮使用方式
本文介绍了如何在Element Plus前端框架中使用带有图标的按钮,包括设置按钮大小、图标大小、按钮类型以及如何为图标添加点击事件。
1834 0
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
980 3
|
JavaScript
vue3 vite配置@根路径---解决:找不到模块“./xx/xxx.vue”或其相应的类型声明
vue3 vite配置@根路径---解决:找不到模块“./xx/xxx.vue”或其相应的类型声明
4983 0
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
789 3
|
JavaScript
Vue在子组件中判断父组件是否传来事件
本文介绍了在Vue中如何通过`vm.$listeners`对象来判断父组件是否传递了特定的事件给子组件,并展示了如何检查事件是否存在以及相应的处理方法。
960 0
Vue在子组件中判断父组件是否传来事件
|
JavaScript 索引
Vue中对象或数组数据更新但视图不刷新问题的解决策略
Vue中对象或数组数据更新但视图不刷新问题的解决策略
1734 0
|
监控 应用服务中间件 网络安全
FastAPI部署大揭秘!如何从代码到云端,让你的Web应用华丽变身生产环境之星?
【8月更文挑战第31天】FastAPI是一款基于Python 3.6+异步特性的高性能Web框架,深受开发者喜爱。本文详细介绍了将FastAPI应用部署到生产环境的过程,包括准备应用、使用Uvicorn测试、配置Gunicorn和Nginx、设置反向代理及监控日志等关键步骤。通过这些步骤,确保应用安全高效地运行在生产环境中,实现高性能与高可扩展性。
2604 0
element UI 中多行消息提示的实现(this.$message的换行)
element UI 中多行消息提示的实现(this.$message的换行)
1312 0

热门文章

最新文章