vue项目中使用Svg的方法

作者:lMadman 时间:2024-05-10 14:14:17 

github demo: github地址

闲聊背景

本文主要以 vue-cli3 搭建的项目为例,来聊一下如何在项目中更优雅的使用 svg 。

众所周知, vue-cli3 已经推出很长一段时间了,大家可以感受一下 vue-cli3 带来的零配置体验。But,也相应带来了一些弊端,就是如归需要修改默认的 loader 时,会比较麻烦。

们接下来主要使用的就是上文中提到的 svg 的 use ,先上一张 vue-cli3 搭建的项目的目录,可以看到根目录下只保留了 public/ 以及 src/ ,可以说非常干净,大家可以自己创建一个。

vue项目中使用Svg的方法

在 src/components/ 下创建 SvgIcon 组件


<template>
<svg :class="svgClass" aria-hidden="true">
<use :xlink:href="iconName"/>
</svg>
</template>

<script>
export default {
name: 'SvgIcon',
props: {
iconClass: {
 type: String,
 required: true,
},
className: {
 type: String,
 default: '',
},
},
computed: {
iconName () {
 return `#icon-${this.iconClass}`
},
svgClass () {
 if (this.className) {
 return 'svg-icon ' + this.className
 } else {
 return 'svg-icon'
 }
},
},
}
</script>

<style scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>

在 src/ 下创建一个 icons 目录,目录结构如下:

vue项目中使用Svg的方法

svg 目录主要用于存放 svg 文件,来看一下 index.js 的内容,功能就是把组件注册到全局,方便使用:


import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon' // svg组件

// 注册到全局
Vue.component('svg-icon', SvgIcon)

const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)

当然,如果你有自己的想法或需求,可以单独引入,无需非要注册到全局。

在 main.js 中引入

vue项目中使用Svg的方法

这一步就没什么好说的了,如果需要注册到全局,需要在入口文件中引入。

好了,接下来是最重要的一步:

修改默认的 loader :

大家可以去vue-cli3官网去查看具体教程,这里我只说需要修改的 loader 以及具体的代码实现。

首先需要注意的是,通过 vue-cli3 构建的项目可以初始化进行很多选择,我构建的目录更多的是以 *.config.js 的形式存在的。

在根目录下创建一个名为 vue.config.js 文件,接下来的操作都和它有关,先来看一下它完整的代码:


const path = require('path')

function resolve (dir) {
return path.join(__dirname, './', dir)
}

module.exports = {
chainWebpack: config => {
config.plugin('define').tap(args => {
 const argv = process.argv
 const icourt = argv[argv.indexOf('--icourt-mode') + 1]

args[0]['process.env'].MODE = `"${icourt}"`

return args
})
// svg rule loader
const svgRule = config.module.rule('svg') // 找到svg-loader
svgRule.uses.clear() // 清除已有的loader, 如果不这样做会添加在此loader之后
svgRule.exclude.add(/node_modules/) // 正则匹配排除node_modules目录
svgRule // 添加svg新的loader处理
 .test(/\.svg$/)
 .use('svg-sprite-loader')
 .loader('svg-sprite-loader')
 .options({
 symbolId: 'icon-[name]',
 })

// 修改images loader 添加svg处理
const imagesRule = config.module.rule('images')
imagesRule.exclude.add(resolve('src/icons'))
config.module
 .rule('images')
 .test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)
},
configureWebpack: {
devServer: {
 open: true,
 // https: true,
 proxy: {
 '/user': {
  target: 'https://devadminschool.icourt.cc',
 },
 '/live': {
  target: 'https://devadminschool.icourt.cc',
 },
 },
},
},
}

大家忽略无关紧要的代码,重点从 svg rule loader 注释开始,其实注释已经比较详细了,就是获取默认的 loader 并进行相关的修改,主要有 svg-loader 、 images-loader ,从 vue-cli3 基础loader 中可以找到这两个 loader 的默认配置。


// 默认的svg loader...
webpackConfig.module
.rule('svg')
.test(/\.(svg)(\?.*)?$/)
.use('file-loader')
 .loader('file-loader')
 .options({
 name: genAssetSubPath('img')
 })

// 默认的images loader...
webpackConfig.module
 .rule('images')
 .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
 .use('url-loader')
  .loader('url-loader')
  .options(genUrlLoaderOptions('img'))

对比我一开始的代码可以看出,我把默认的 svg loader 配置中使用的 file-loader 改为了 svg-sprite-loader ,并排除了 node_modules ,把默认的 images-loader 配置添加了 svg ,并排除了 src/icons 目录。

如何使用?

  • 可以把设计大大给的svg 或者从iconfont官网下载开源的icon的svg格式,复制到 src/icons/svg 目录下;

  • 点击 svg 查看源码,修改 fill 属性, fill="currentColor" ,或者 fill="" ,如果无此属性,就不用管,这样做是可以让外部控制icon的颜色,或随父元素的color;

  • 注意svg命名和SvgIcon命名一致,看一下最终使用:

vue项目中使用Svg的方法

这里就会使用 src/icons/svg/go-back.svg 文件。

总结:

以上讲的比较糙,奈何文字功底是硬伤,最后附上github demo 代码示例:
此项目也可以当做项目初始架构,内置了vue-router、vuex等。
本文以vue-cli3创建的项目为例,之前的项目可以直接去手动修改对应的loader即可。

github地址

总结

以上所述是小编给大家介绍的vue项目中使用Svg的方法网站的支持!

来源:https://juejin.im/post/5bcfdad4e51d457a8254e9d6

标签:vue,svg
0
投稿

猜你喜欢

  • ubuntu16.04在python3 下创建Django项目并运行的操作方法

    2021-02-01 11:03:50
  • javascript彩虹圈效果

    2011-08-05 19:10:45
  • Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)

    2023-10-20 19:36:33
  • Python实现比较两个列表(list)范围

    2022-07-20 18:08:04
  • Golang实现将视频按照时间维度剪切的工具

    2024-02-14 08:19:08
  • security.js实现的RSA加密功能示例

    2024-04-08 10:54:12
  • Python 函数list&read&seek详解

    2022-02-14 03:04:21
  • Python进阶之协程详解

    2023-08-23 04:52:52
  • Python中的index()方法使用教程

    2023-05-13 20:02:31
  • python代码的几种常见加密方式分享

    2021-05-19 02:14:56
  • python实现处理mysql结果输出方式

    2024-01-28 03:30:42
  • Python上下文管理器详细使用教程

    2021-06-24 05:47:35
  • js中eval()函数和trim()去掉字符串左右空格应用

    2024-04-19 10:00:16
  • Python实现读取字符串按列分配后按行输出示例

    2023-08-07 19:39:14
  • 一文带你掌握Pyecharts地理数据可视化的方法

    2023-01-10 03:52:50
  • python的pip安装以及使用教程

    2022-12-05 11:04:37
  • Mysql字段为null的加减乘除运算方式

    2024-01-17 23:35:40
  • python版微信跳一跳游戏辅助

    2021-08-16 09:03:19
  • 利用Python制作一个愚人节整蛊消息框

    2022-08-07 22:06:53
  • python实现快递价格查询系统

    2023-02-06 11:20:27
  • asp之家 网络编程 m.aspxhome.com