Vite创建的Vue3项目中封装SvgIcon组件

什么是Svg?

SVG(Scalable Vector Graphics)是一种基于可扩展标记语言(XML)的开放标准矢量图形格式。它用于描述二维矢量图形,并且可以嵌入到HTML和XML文档中。SVG文件可以通过文本格式的描述性语言来描述图像内容,因此它是一种和图像分辨率无关的矢量图形格式。

SVG图形格式具有许多优点。首先,图像文件可读,易于修改和编辑。其次,它与现有技术可以互动融合,例如SVG技术本身的动态部分是基于SMIL标准。此外,SVG文件非常轻巧,这意味着它们可以很快地加载,即使是在网络上。最后,SVG可以支持多种效果,如渐变、阴影和反射等,这些效果不可能用位图完成。

Svg格式图片和其他格式图片有什么区别呢?

SVG图片和常见的位图图片(如JPEG和PNG)有很大的区别。位图图片是由许多像素点组成的,而矢量图形是由数学公式定义的。这使得矢量图形可以在不损失质量的情况下进行任意缩放,而位图图片在放大时则会变得模糊。

为什么我们要将其封装成一个单独的组件?

  1. 可缩放性:SvgIcon组件可以利用SVG的特性,使得图标可以在不失真的情况下进行缩放。这对于需要根据用户需求动态调整大小或者需要在不同分辨率下都能清晰显示的图标来说非常有用。
  2. 可编辑性:由于SVG图标是由XML代码定义的,因此可以方便地进行修改和编辑。这在需要定制图标或者图标需要经常变动的情况下非常方便。
  3. 支持复杂交互:SVG图标可以支持鼠标事件(如点击、悬停等),这使得可以在图标上实现一些复杂的交互功能。

SvgIcon组件在Vue中用于专门展示SVG图标,可以充分利用SVG的优点,使得图标的显示和交互都能得到更好的支持。

封装过程

我们借助插件实现SvgIcon组件的封装,具体步骤如下:

  1. 安装插件:yarn add -D vite-plugin-svg-icons
  2. 配置vite.config.js(vite.config.ts)配置文件,导入,并将其插件配置到plugins数组当中
js 复制代码
// SvgIcon组件封装插件引入
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'

export default defineConfig({
  // 其他配置...
  plugins: [
      createSvgIconsPlugin({
          // 指定需要缓存的图标文件夹
          iconDirs: [path.resolve(process.cwd(), 'src/assets/svg')],
          // 指定symbolId格式
          symbolId: 'icon-[dir]-[name]'
      })
  ]
})
  1. 新建SvgIcon组件
vue 复制代码
<template>
  <!--svg外层容器,需要配置子元素use使用-->
  <svg :style="{width, height}">
    <!--xlink:href引用的svg图标,#icon-图标名-->
    <use :xlink:href="symbolId" :fill="fill" />
  </svg>
</template>

<script setup>
import {computed} from "vue"
const props = defineProps({
  prefix: {
    type: String,
    default: 'icon'
  },
  name: {
    type: String,
    required: true
  },
  width: {
    type: String,
    default: "16px"
  },
  height: {
    type: String,
    default: "16px"
  },
  fill: {
    type: String,
    default: '#333'
  }
})
// svg icon引入的格式
const symbolId = computed(() => {
  return `#${props.prefix}-${props.name}`
})
</script>
  1. 配置main.js(main.ts),在其中新增一行注册svg图标注册
js 复制代码
// svg图标注册
import 'virtual:svg-icons-register'
  1. 使用,在使用的组件中导入svgIcon,然后指定其属性name(表示svg图片名称,需要与svg文件名去除后缀一致)
js 复制代码
<template>
  <svg-icon name="sun" fill="red"/>
</template>

<script setup>
import svgIcon from '@/components/svgIcon/index.vue'
</script>

上述name必须指定sun,然后插件会根据dir-name去找到对应目录的svg图片

推荐一个Svg图标库

参考阿里巴巴的开源矢量图组件库iconfont,传送门:www.iconfont.cn/

相关推荐
无巧不成书02187 分钟前
Vue+Vue-CLI全平台零基础搭建教程
前端·javascript·vue.js·vue·前端开发·vue-cli·前端环境搭建
张人玉1 小时前
基于 Vue 3 + ECharts + Express + SQLite 的可视化大屏与业务管理系统——YOLOv8 高精度车辆行人检测与计数系统
数据库·vue.js·yolo·sqlite·echarts·express
腻害兔10 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
sugar__salt17 小时前
Vue3 表单双向绑定与响应式核心 API 技术详解
前端·javascript·vue.js
郝亚军17 小时前
使用Vue 3和Nginx打包和部署Vue.js项目的一般步骤
前端·vue.js·nginx
阿懂在掘金19 小时前
企业级命令式弹窗方案:三行代码适配已有 Dialog
前端·vue.js·前端框架
YWL20 小时前
OpenLayers + Vue 2 使用指南(01)
前端·javascript·vue.js
达子66620 小时前
第8章_HarmonyOs开发图解 剪贴板
vue.js
森林的尽头是阳光1 天前
tree回显问题
javascript·vue.js·elementui
qetfw1 天前
MWU:Vue 3 + FastAPI 的 MaaFramework 跨平台 WebUI 源码
前端·vue.js·python·fastapi·开源项目·效率工具