Vue项目中svg-icon组件的基本使用

2022-07-24 12:18:51

一、基本了解

首先,我们先了解一下什么是SVG格式百度百科:SVG格式
SVG是一种图像文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有交互功能,并可以随时插入到HTML中通过浏览器来观看。此类图像文件的扩展名为(xxx.svg)
学习网站:SVG 教程

二、基本使用步骤

(一)安装依赖

npm i svg-sprite-loader@4.1.3

(二)配置vue.config.js

const path=require('path')functionresolve(dir){return path.join(__dirname, dir)}{// 省略其他...// 与devServer配置项同级chainWebpack(config){// set 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()}}

(三)创建文件/文件夹

(1)src/icons 文件夹

src/icons
+       /svg# 文件夹内保存图标 .svg文件 .svg是一种通过代码的方式来展示的图片格式
+       /index.js# 注册全局组件

svg文件夹内的图标
建议下载网站阿里巴巴矢量图标库

下载步骤 (需登陆后下载)

第一步 搜索需要的图标样式

第一步

第二步 复制svg代码

在这里插入图片描述

第三步

在src/icons/svg下,建立一个名为qq.svg的文件(文件名是可以任意取的),并把上一步中复制的代码粘过来。

第四步

等待使用

index.js 内代码

// index.js 内代码import Vuefrom'vue'import SvgIconfrom'@/components/SvgIcon'// svg component svg组件// register globally 全局注册
Vue.component('svg-icon', SvgIcon)const req= require.context('./svg',false,/\.svg$/)constrequireAll=requireContext=> requireContext.keys().map(requireContext)requireAll(req)

(2)svg组件

src/componets/SvgIcon/index.vue

<!-- 组件内基本样式 --><template><divv-if="isExternal":style="styleExternalIcon"class="svg-external-icon svg-icon"v-on="$listeners"/><svgv-else:class="svgClass"aria-hidden="true"v-on="$listeners"><use:xlink:href="iconName"/></svg></template><script>/* doc: https://panjiachen.github.io/vue-element-admin-site/feature/component
/svg-icon.html#usage */import{ isExternal}from'@/utils/validate'exportdefault{
  name:'SvgIcon',
  props:{
    iconClass:{
      type: String,
      required:true},
    className:{
      type: String,default:''}},
  computed:{isExternal(){returnisExternal(this.iconClass)},iconName(){return`#icon-${this.iconClass}`},svgClass(){if(this.className){return'svg-icon '+this.className}else{return'svg-icon'}},styleExternalIcon(){return{
        mask:`url(${this.iconClass}) no-repeat 50% 50%`,'-webkit-mask':`url(${this.iconClass}) no-repeat 50% 50%`}}}}</script><stylescoped>.svg-icon{width: 1em;height: 1em;vertical-align: -0.15em;fill: currentColor;overflow: hidden;}.svg-external-icon{background-color: currentColor;mask-size: cover!important;display: inline-block;}</style>

(3)validate.js

utils/validate.js

/**
 * @param {string} path
 * @returns {Boolean}
 */exportfunctionisExternal(path){return/^(https?:|mailto:|tel:)/.test(path)}/**
 * @param {string} str
 * @returns {Boolean}
 *//* export function validUsername(str) {
  const valid_map = ['admin', 'editor']
  return valid_map.indexOf(str.trim()) >= 0
} */

(四)在main.js中引入

import'@/icons'// icon 文件夹

(五)使用

<svg-iconicon-class="文件名"/><!-- 这里的文件名就是在src/icons/svg下的文件名(例如qq.svg) -->
  • 作者:欢玺Yee
  • 原文链接:https://blog.csdn.net/weixin_57246557/article/details/119612862
    更新时间:2022-07-24 12:18:51