vue2+vue3封装使用svg图标

news2025/1/11 19:42:51

需求:1.在vue2中封装使用svg

           2.在vue3中封装使用svg

           3.在vue3中使用自定义插件封装多个组件

1.获取svg图标操作

 在阿里巴巴矢量图标库找自己需要的svg图标

地址:阿里巴巴矢量图标库

随便找个图标点击下载

选择好尺寸后就可以点击复制svg代码了 

 

 在assets下创建icons文件夹,并且新建svg文件,文件名任意

 把复制好的svg代码贴到svg文件中

2.在vue2中封装使用SVG

2.1下载svg插件,我直接下载的最新版6.0.11版本

npm Install svg-sprite-loader

 2.2在component文件夹下==》新建SvgIcon文件夹==》并且新建index.vue

<template>
  <svg :style="{ width, height }" aria-hidden="true">
    <use :xlink:href="iconName" :fill="color" />
  </svg>
</template>

<script>
export default {
  name: "SvgIcon",
  props: {
    iconClass: {
      type: String,
      required: true,
    },
    className: {
      type: String,
    },
    //   图标的颜色
    color: {
      type: String,
      default: "",
    },
    //   接收父组件传递过来图标的宽高
    width: {
      type: String,
      default: "16px",
    },
    height: {
      type: String,
      default: "16px",
    },
  },
  computed: {
    iconName() {
      return `#icon-${this.iconClass}`;
    },
  },
};
</script>

<style scoped></style>

2.3在icons文件夹下新建index.js

import Vue from 'vue'
import SvgIcon from '../components/SvgIcon'// svg封装地址
 
// register globally
Vue.component('svg-icon', SvgIcon)
 
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)

2.4 在vue.config.js文件中导入

之前跟着网上导入后resolve报错,如果有报错就和我一样添加path就行

const { defineConfig } = require('@vue/cli-service')
const path = require('path');
module.exports = defineConfig({
  transpileDependencies: true,
  chainWebpack (config) {
    config.module
      .rule('svg')
      .exclude.add(path.resolve('src/icons/svg'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(path.resolve('src/icons/svg'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()
  }

})

2.5在main.js中导入icons

import "./icons/index";

2.6 页面使用

注意这个loading一定要和svg文件名(你自己取的名字)一致

    <svg-icon icon-class="loading" width="30px" height="30px" color="red"/>

 

 2.7 效果

 2.8 问题:为什么颜色写了不起作用

打开svg文件,找到fill=“”,之后删除就可以了,如果人家svg自带颜色你写的时候不生效就去删了就行

3.在vue3中封装使用SVG

3.1下载svg插件

npm install vite-plugin-svg-icons

3.2 在vite.config.ts中导入使用

// 配置svg依赖插件
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';

export default defineConfig({
  plugins: [
    vue(),
    createSvgIconsPlugin({
      iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],//svg的文件存放路径
      symbolId: 'icon-[dir]-[name]',
    }),
  ],
  },
});

3.3在main.ts中引入svg插件

// svg插件需要的配置代码
import 'virtual:svg-icons-register'

3.4 在component文件夹下创建SvgIcon文件

并添加index.vue

在这里我写了俩种前缀方法,可自行选择一种

<template>
  <!-- svg:图标外层容器节点,内部需要与use标签结合使用 -->
  <svg :style="{ width, height }">
    <!-- xlink:href :决定使用哪个图标 -->
    <!-- 第一种前缀方法 -->
    <!-- <use :xlink:href="prefix+name" :fill="color"></use> -->
    <!-- 第二种前缀方法 -->
    <use :xlink:href="icon" :fill="color"></use>
  </svg>
</template>

<script setup lang="ts">
import { computed } from 'vue';
const props = defineProps({
  // xlink:href属性值的前缀-------第一种方法
  prefix: {
    type: String,
    default: '#icon-',
  },
  // 提供使用属性的明智
  name: String,
  //   图标的颜色
  color: {
    type: String,
    default: '',
  },
  //   接收父组件传递过来图标的宽高
  width: {
    type: String,
    default: '16px',
  },
  height: {
    type: String,
    default: '16px',
  },
});
 // xlink:href属性值的前缀------第二种方法
let icon = computed(() => {
  return `#icon-${props.name}`;
});
</script>

<style scoped></style>

3.5 在main.ts中导入注册

这里我修改了一个,使用的是@/引入方式,如果报错的话就用../就行

import SvgIcon from "@/components/SvgIcon/index.vue"
// 将应用挂载到挂载点上
app.component('SvgIcon',SvgIcon);

3.6 页面使用

在你需要svg的页面中直接使用就可以了

注意:这个name=“edit”的edit是icons文件下创建的叫edit.svg的文件名

   <SvgIcon name="edit" color="pink" width="30px" height="30px"></SvgIcon>

3.7 效果

 

 4.使用自定义插件封装多个组件

4.1 在component文件夹下创建index.ts文件

其中:import SvgIcon from './SvgIcon/index.vue';
import Pagination from './Pagination/index.vue';这俩个就是之前封装好的svg组件内容还有个分页封装的内容

// 对外暴露插件对象
import SvgIcon from './SvgIcon/index.vue';
import Pagination from './Pagination/index.vue';
const allGlobalComponents: any = { SvgIcon, Pagination };

export default {
  // 必须交install方法
  install(app: any) {
    // 有几个组件就注册几次
    Object.keys(allGlobalComponents).forEach((key) => {
      console.log(key);
      app.component(key, allGlobalComponents[key]);
    });
  },
};

4.2 在main.ts中导入并使用

import globalComponent from '@/components'
app.use(globalComponent);

4.3 使用

无需导入,在页面可直接使用

 <SvgIcon name="edit" color="pink" width="60px" height="60px"></SvgIcon>
   <pagination></pagination>

4.3 效果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于互斥锁的生产者消费者模型

文章目录 生产者消费者 定义代码实现 / 思路完整代码执行逻辑 / 思路 局部具体分析model.ccfunc&#xff08;消费者线程&#xff09; 执行结果 生产者消费者 定义 生产者消费者模型 是一种常用的 并发编程模型 &#xff0c;用于解决多线程或多进程环境下的协作问题。该模型包含…

Windows如何部署Jenkins

一、简介 Jenkins 是国际上流行的免费开源软件项目&#xff0c;基于Java 开发持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;提供一个开放的易用的软件平台&#xff0c;使软件的持续集成自动化&#xff0c;大大节约人力和时效。 二、Java JDK 访问 OpenLogic…

入行嵌入式的几个必备技能

嵌入式作为时下最热的行业之一&#xff0c;有不少朋友想入行却不得其法&#xff0c;这里为大家提供几个嵌入式行业必备的技能。 精通C语言 嵌入式系统中&#xff0c;精通C语言至关重要。 对于嵌入式软件开发者而言&#xff0c;掌握C语言是必要条件。在大学期间&#xff0c;你…

【8月19日】红帽openstack管理课程(CL210) 新一轮开课

课程介绍 通过实验室操作练习&#xff0c;学员将能够深入学习红帽企业 Linux OpenStack 平台各服务的手动安装方法&#xff0c;还将了解 OpenStack 开发社区的未来发展计划。 培训地点&#xff1a; 线下面授&#xff1a;苏州市姑苏区干将东路666号和基广场401室&#xff1b;…

原生微信小程序自定义picker多列选择器:picker写法用法

前言: 最近用原生微信小程序写法写医疗相关项目微信小程序&#xff0c;在编辑个人资料的时候&#xff0c;需要很多选择器&#xff0c;比如城市地区选择器&#xff0c;职业职称选择器&#xff0c;科室选择器&#xff0c;学校选择器&#xff0c;学历选择器&#xff0c;年份日期选…

无涯教程-TensorFlow - TensorBoard可视化

TensorFlow包含一个可视化工具&#xff0c;称为TensorBoard&#xff0c;它用于分析数据流图&#xff0c;还用于了解机器学习模型。 TensorBoard的重要功能包括查看有关垂直对齐的任何图形的参数和详细信息的不同类型统计的视图。 深度神经网络包括多达36&#xff0c;000个节点…

大数据Flink(六十四):Flink运行时架构介绍

文章目录 Flink运行时架构介绍 一、系统架构 二、​​​​​​​​​​​​​​整体构成 三、作业管理器&#xff08;JobManager&#xff09; 四、任务管理器&#xff08;TaskManager&#xff09; Flink运行时架构介绍 我们已经对 Flink 的主要特性和部署提交有了基本的了…

机器视觉工程们,我们值多少钱

&#xff08;QQ群有答疑&#xff09;零基础小白快速上手海康VisionMaster开发系列课程 UP主你的主题太吸引人&#xff0c;也太不近人情世故了&#xff0c;实施上&#xff0c;别人总是这样子去想。 人们会根据自己的观点去评价别人&#xff0c;去评估别人的价值&#xff0c;其实…

第1天----验证一个字符串是否是另一个字符串的子串

本文我们将学习如何去验证一个字符串是否是另一个字符串的子串。 一、小试牛刀&#xff1a; 题目描述 输入两个字符串&#xff0c;验证其中一个串是否为另一个串的子串。 输入格式 两行&#xff0c;每行一个字符串。 输出格式 若第一个串 s 1 是第二个串 s 2 的子串&#xff0c…

前端:VUE2中的父子传值

文章目录 一、背景什么是父子传值二、业务场景子传父1、在父页面中引入子页面2、子传父&#xff1a;父组件标识3、子传父&#xff1a;子组件标识 父传子父组件调用子组件中的方法 总结&#xff1a; 一、背景 最近做项目中需要使用到流工作&#xff0c;在这里流工作需要用到父子…

GM65二维码识别模块+命令控制

简介 MG65 条码识读模块&#xff0c;一款性能优良的扫描引擎&#xff0c;不仅能够轻松读取各类一维条码&#xff0c;而且可以高速读取二维条码&#xff0c;对线性条形码具有非常高的扫描速率&#xff0c;针对纸质条码及显示屏上的条码&#xff0c;也都能轻松扫描。 一、模块参…

【云原生】kubernetes应用程序包管理工具Helm

Helm 什么是 Helm 安装 Helm 重要概念 使用 Helm 1 简介 官网地址: Helm Helm是一个Kubernetes应用程序包管理工具&#xff0c;它允许你轻松管理和部署Kubernetes应用程序。Helm通过使用称为Charts的预定义模板来简化Kubernetes应用程序的部署和管理。Chart包含了一组Ku…

YOLOv5算法改进(2)— 添加SE注意力机制

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。注意力机制是近年来深度学习领域内的研究热点&#xff0c;可以帮助模型更好地关注重要的特征&#xff0c;从而提高模型的性能。注意力机制可被应用于模型的不同层级&#xff0c;以便更好地捕捉图像中的细节和特征&#xff…

LeetCode_动态规划_困难_1388.3n 块披萨

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个披萨&#xff0c;它由 3n 块不同大小的部分组成&#xff0c;现在你和你的朋友们需要按照如下规则来分披萨&#xff1a; 你挑选任意一块披萨。Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨。…

使用metasploit(MSF)对windows的ms17-010漏洞进行利用

主机发现 Ping扫描-禁用端口扫描 nmap -sn 192.168.1.0/24 ─# nmap -sn 192.168.1.0/24 Starting Nmap 7.93 ( https://nmap.org ) at 2023-08-14 10:00 EDT Nmap scan report for 192.168.1.1 Host is up (0.0053s latency). MAC Address: FC:BC:D1:C7:2F:A8 (Huawei Te…

SystemVerilog interface使用说明

1. Interface概念 System Verilog中引入了接口定义&#xff0c;接口与module 等价的定义&#xff0c;是要在其他的接口、module中直接定义&#xff0c;不能写在块语句中&#xff0c;跟class是不同的。接口是将一组线捆绑起来&#xff0c;可以将接口传递给module。 2. 接口的优…

Mysql性能优化:什么是索引下推?

导读 索引下推&#xff08;index condition pushdown &#xff09;简称ICP&#xff0c;在Mysql5.6的版本上推出&#xff0c;用于优化查询。 在不使用ICP的情况下&#xff0c;在使用非主键索引&#xff08;又叫普通索引或者二级索引&#xff09;进行查询时&#xff0c;存储引擎…

同一个区域多景影像使用同一个拉伸色带显示

问题描述 现需要对11景某一个区域的NDVI数据进行出图&#xff0c;且需要使用同一个拉伸的色带&#xff0c;但是拉伸色带的间断值是根据影像的直方图确定的&#xff0c;意味着11景影像会有11个不同的拉伸色带&#xff0c;不符合需求。 解决方法 目前想到的解决方法就是将11景…

稚晖君人形机器人问世:大模型加持,会自己换胳膊,要上生产线造车

从零开始,不到半年就造出人形机器人,还自带软硬件体系。 大模型技术的新一波浪潮:具身智能,已经有了重要进展。 刚刚,稚晖君的创业公司「智元机器人」开了自己的第一场发布会。 以「天才少年」身份加入华为的稚晖君(彭志辉)于去年底宣布离职创业,人们都在关注他在机器…

类的访问限定符,实例化,对象存储方式,this指针

目录 类的定义 类的两种定义方式&#xff1a; 访问限定符 类的实例化 类对象的存储方式 this指针 C语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。比如&#xff1a; 之前在数据结构初阶中&#xff0c;用C语…