Vue 3.0 中封装icon组件使用外部SVG图标

通常在企业级项目开发时,所使用的 icon 图标,一共分为两类:

1. element-plus 的图标

2. 自定义的 svg 图标

对于 element-plus 的图标我们可以直接通过 el-icon 来进行显示,但是自定义图标的话却无法正常显示,所以就需要一个自定义的组件,来显示我们自定义的 svg 图标。

对于这个组件的话,它就需要拥有两种能力:

1. 显示外部 svg 图标

2. 显示项目内的 svg 图标

下面将向大家介绍如何实现这个组件的开发:

1.  处理外部 svg 图标显示

1.1. 创建组件

<!-- components/SvgIcon/index.vue -->

<template>
    <div
        v-if="isExternal"
        :class="className"
        :style="styleExternalIcon"
        class="svg-external-icon svg-icon"
    />
    <svg v-else class="svg-icon" :class="className" aria-hidden="true">
        <use :xlink:href="iconName" />
    </svg>
</template>


<script setup>
import { defineProps, computed } from "vue";

const props = defineProps({
    icon: {
        type: String,
        required: true,
    },
    className: {
        type: String,
        default: "",
    }
});


// 判断外部方法
const  isExternalPath=(path)=> {
    return /^(https?:|mailto:|tel:)/.test(path)
}

// 判断是否外部
const isExternal = computed(() => isExternalPath(props.icon));

// 外部图标样式
const styleExternalIcon = computed(() => ({
    mask: `url(${props.icon}) no-repeat 50% 50%`,
    "-webkit-mask": `url(${props.icon}) no-repeat 50% 50%`,
}));

// 项目内部图标
const iconName = computed(() => `#icon-${props.icon}`);


</script>

<style scoped>

.svg-icon {
    width: 1em;
    height: 1em;
    overflow: hidden;
    fill: currentColor;
    vertical-align: -0.15em;
}

.svg-external-icon {
    background-color: currentColor;
    mask-size: cover !important;
    display: inline-block;
}
</style>

1.2. 页面引入定义的组件

import SvgIcon from '@/components/SvgIcon/index.vue'

1.3.  页面中使用组件

<span class="svg-container">
	<svg-icon icon="https://res.lgdsunday.club/user.svg"></svg-icon>
</span>

2. 处理内部 svg 图标显示

2.1. 导入项目需要使用的图标

2.2. 引入图标并全局注册

如上图所示,添加一个index.js文件,代码如下:

// icons/index.js

import SvgIcon from "@/components/SvgIcon";

// 通过函数实现自定义上下文
const svgRequire = require.context("./svg", false, /\.svg$/);
svgRequire.keys().forEach((svgIcon) => svgRequire(svgIcon));

export default (app) => {
    app.component("svg-icon", SvgIcon);
};

2.3. 在 main.js 中引入该文件

// main.js
...
// 导入 svgIcon
import installIcons from '@/icons'
...
installIcons(app)
...

2.4. 在页面中使用组件

// 用户名   
<svg-icon icon="user" />
// 密码
<svg-icon icon="password" />
// 眼睛
<svg-icon icon="eye" />

注意:由于组件在全局注册了,局部页面中无需额外导入。

3. 使用 svg-sprite-loader 处理 svg 图标

为了让图标正常展示,还要给webpack添加一个loader,而svg-sprite-loader 是 webpack 中专门用来处理 svg 图标的一个 loader 。

3.1. 安装loader

npm i --save-dev svg-sprite-loader@6.0.9

3.2. 配置loader

创建 vue.config.js 文件,新增如下配置:

const path = require("path");
function resolve(dir) {
    return path.join(__dirname, dir);
}

module.exports = {
    chainWebpack(config) {
        // 设置 svg-sprite-loader
        config.module.rule("svg").exclude.add(resolve("src/icons")).end();
        config.module
            .rule("icons")
            .test(/\.svg$/)
            .include.add(resolve("src/icons"))
            .end()
            .use("svg-sprite-loader")
            .loader("svg-sprite-loader")
            .options({
                symbolId: "icon-[name]",
            })
            .end();
    },
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/947115.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库笔记——多版本并发控制MVCC

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;本文详细介绍MySQL的并发控制&#xff1a;多版本并发控制MVCC。 文章目录 背景介绍数据库并发控制——锁机制悲观锁和乐观锁悲观锁乐观锁 数据库并发控制——MVCC 的引入MVCC 和锁机…

PDF怎么压缩得又小又清晰?5种PDF压缩方法

PDF 文件在日常办公与学习中使用极为频繁&#xff0c;可想要把它压缩得又小又清晰却困难重重。一方面&#xff0c;PDF 格式本身具有高度兼容性&#xff0c;集成了文字、图像、矢量图等多样元素&#xff0c;压缩时难以兼顾不同元素特性&#xff0c;稍不注意&#xff0c;文字就会…

面向机器学习的Java库与平台

学习Java语言中与机器学习相关的各种库与平台&#xff0c;了解每个库的功能&#xff0c;以及可以用它 们解决的问题。  实现机器学习应用时需要具备的Java环境  Weka&#xff1a;一个通用的机器学习平台  Java机器学习库&#xff1a;一系列机器学习算法  Apache Mah…

前端CSS3学习

学习菜鸟教程 火狐-moz- 谷歌 Safari -webkit- 前面都加这个&#xff0c;可能才生效 边框 border: 1px solid #ddd 粗细 样式 样色 经常和border-radius 一块用 border-radius: 50px 20px 第一个左右 第二个右左 border-top-left-radius … box-shadow: 10px 5px 10px 0 #88…

【LoRa】长交织Long Interleaver

目录 1 前言2 CR与长交织3 小结 1 前言 在使用Semtech的第三代LoRa芯片&#xff08;LR11xx系列&#xff09;配置参数时&#xff0c;可能会注意到参数CR多出了Long Interleaver参数选项&#xff0c;截取lr11xx_driver代码片段如下&#xff1a; /*!brief LoRa Coding Rate conf…

HAL 库------中断相关函数

HAL_SuspendTick();是对SysTick中CTRL寄存器中TICKINT位清0 HAL_ResumeTick(); 刚好与上面函数相反&#xff0c;对SysTick中CTRL寄存器中TICKINT位置1&#xff0c;恢复stick中断。

IntelliJ Idea常用快捷键详解

文章目录 IntelliJ Idea常用快捷键详解一、引言二、文本编辑与导航1、文本编辑2、代码折叠与展开 三、运行和调试四、代码编辑1、代码补全 五、重构与优化1、重构 六、使用示例代码注释示例代码补全示例 七、总结 IntelliJ Idea常用快捷键详解 一、引言 在Java开发中&#xff…

RabbitMQ端口操作

1、什么是RabbitMQ RabbitMQ 是一种可靠且成熟的消息传递和流式处理代理&#xff0c;易于部署在云环境、本地和本地计算机上。目前&#xff0c;全球有数百万人在使用它。 RabbitMQActiveMQRocketMQKafka公司/社区RabbitApache阿里Apache开发语言ErlangJavaJavaScala&Java…

设计模式 创建型 建造者模式(Builder Pattern)与 常见技术框架应用 解析

单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;又称生成器模式&#xff0c;是一种对象构建模式。它主要用于构建复杂对象&#xff0c;通过将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建出具有不同表示的对象。该模式的核心思想是将…

2、pycharm常用快捷命令和配置【持续更新中】

1、常用快捷命令 Ctrl / 行注释/取消行注释 Ctrl Alt L 代码格式化 Ctrl Alt I 自动缩进 Tab / Shift Tab 缩进、不缩进当前行 Ctrl N 跳转到类 Ctrl 鼠标点击方法 可以跳转到方法所在的类 2、使用pip命令安装request库 命令&#xff1a;pip install requests 安装好了…

jenkins修改端口以及开机自启

修改Jenkins端口 方式一&#xff1a;通过配置文件修改&#xff08;以CentOS为例&#xff09; 找到配置文件&#xff1a;在CentOS系统中&#xff0c;通常可以在/etc/sysconfig/jenkins文件中修改Jenkins的配置。如果没有这个文件&#xff0c;也可以查看/etc/default/jenkins&…

破解密码

rhel8/centos8 重置 root 密码 方法 1 &#xff1a; rd.break 第 1 步 重启系统&#xff0c;在下图所示界面按 e 键 第2步 找到linux这行&#xff0c;末尾空格后 输入 rd.break 第3步 查看&#xff0c;可选步骤 这里 sysroot 是以只读的形式挂载的&#xff0c;所以要以可读可…

时间序列预测算法---LSTM

目录 一、前言1.1、深度学习时间序列一般是几维数据&#xff1f;每个维度的名字是什么&#xff1f;通常代表什么含义&#xff1f;1.2、为什么机器学习/深度学习算法无法处理时间序列数据?1.3、RNN(循环神经网络)处理时间序列数据的思路&#xff1f;1.4、RNN存在哪些问题? 二、…

从零用java实现 小红书 springboot vue uniapp (7)im 在线聊天功能 关注功能

前言 移动端演示 http://8.146.211.120:8081/#/ 前面的文章我们主要完成了笔记的点赞和收藏及留言功能 今天我们讲解点赞关注 im 聊天功能 关注 我们需要有一个关注的操作 这里我们复用个人中心页面 按钮会有三种形式 关注 取消关注 互相关注三种样式 <view class"gui…

PP模块部分BAPI函数

工艺路线 BAPI_ROUTING_CREATE 创建工艺路线 BAPI_ROUTING_EXISTENCE_CHECK 检查工艺路线是否存在 参考操作集 BAPI_REFSETOFOPERATIONS_CREATE 创建参考操作集 BAPI_REFSETOFOPR_EXISTENCE_CHK 检查参考操作集是否存在 计划订单 BAPI_PLANNEDORDER_CREATE 创建计划订单 BAPI…

Tomcat解析

架构图 核心功能 Tomcat是Apache开源的轻量级Java ServletServlet容器&#xff0c;其中一个Server&#xff08;Tomcat实例&#xff09;可以管理多个Service&#xff08;服务&#xff09;&#xff0c;一个Service包含多个Connector和一个Engine&#xff0c;负责管理请求到应用的…

【openGauss】正则表达式次数符号“{}“在ORACLE和openGauss中的差异

一、前言 正则作为一种常用的字符串处理方式&#xff0c;在各种开发语言&#xff0c;甚至数据库中&#xff0c;都有自带的正则函数。但是正则函数有很多标准&#xff0c;不同标准对正则表达式的解析方式不一样&#xff0c;本次在迁移一个ORACLE数据库到openGauss时发现了一个关…

C# 修改项目类型 应用程序程序改类库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

DataV数据可视化

阿里云 DataV 是一个强大的数据可视化工具&#xff0c;可以帮助用户通过创建丰富的图表、仪表盘、地图和互动视图&#xff0c;将复杂的数据转化为易于理解和分析的可视化信息。DataV主要用于大数据和实时数据的展示&#xff0c;可以帮助企业和个人更直观地理解数据背后的含义&a…

STM32-笔记18-呼吸灯

1、实验目的 使用定时器 4 通道 3 生成 PWM 波控制 LED1 &#xff0c;实现呼吸灯效果。 频率&#xff1a;2kHz&#xff0c;PSC71&#xff0c;ARR499 利用定时器溢出公式 周期等于频率的倒数。故Tout 1/2KHZ&#xff1b;Ft 72MHZ PSC71&#xff08;喜欢设置成Ft的倍数&…