svg

1. 安装依赖

npm install svg-sprite-loader --save-dev#yarn add svg-sprite-loader

`svg-sprite-loader` 是 webpack loader,可将多个 svg 打包成 svg-sprite

安装完后还需要进行改造,原因是:`vue-cli` 默认情况下会使用 `url-loader` 对svg进行处理,会将它放在 `/img` 目录下,这时候引入`svg-sprite-loader`会引起冲突

//默认`vue-cli` 对svg做的处理,正则匹配后缀名为.svg的文件,匹配成功之后使用 url-loader 进行处理。{test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,loader: 'url-loader',options: {limit: 10000,name: utils.assetsPath('img/[name].[hash:7].[ext]')}}

改造:

  • `svg-sprite-loader` 只处理指定文件下的svg
  • `url-loader` 只处理指定文件以外的所有svg

vue-cli2

在webpack.base.conf.js的 `rules` 中加上:

{test: /\.svg$/,loader: 'svg-sprite-loader',include: [resolve('src/icons')],options: {symbolId: 'icon-[name]' // name代表图标的名字}},{test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,loader: 'url-loader',exclude: [resolve('src/icons')], // 使用exclude排除src/icons,让url-loader只处理除此文件夹之外的svgoptions: {limit: 10000,name: utils.assetsPath('img/[name].[hash:7].[ext]')}}

vue-cli3 在 `vue.config.js` 中添加如下webpack的配置

const path = require("path");function resolve(dir) {return path.join(__dirname, dir);}module.exports = {chainWebpack(config) {config.module.rule("svg").exclude.add(resolve("src/icons")) // 使用exclude排除src/icons,让url-loader只处理除此文件夹之外的svg.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();},};

2. 在 `@/src/components` 下新建 `SvgiCon.vue`组件

<template><svg :class="svgClass" aria-hidden="true"><use :xlink:href="iconName"></use></svg></template><script>export default {name: "svg-icon",props: {iconClass: {type: String,required: true,},className: {type: String,},},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>

3. 在src目录下新建icons、svg文件夹和index.js文件,目录结构如下

svg 文件夹存放要使用的 .svg 图片,然后使用 index.js 自动引入 `@/src/icons/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$/)// 加载目录下所有 .svg文件requireAll(req)

这样每次只要增删改对应的图标,就会自动生成 `svg symbol`

4. 在 `main.js`中引入

import './icons'

5. 在页面中使用

<svg-icon iconClass="chart"></svg-icon>

iconClass的赋值名字要和svg文件名一致

ps:index.js中require.context的使用

一般情况下,文件引入使用import,但是像这种情况,文件夹下有多个svg文件,如果单个import,就会很繁琐,而且以后增加了svg文件,都需要修改index.js,针对这种场景,就需要用到context,此方法接受三个参数,文件路径,是否引入文件的子目录,正则匹配文件,如

const req = require.context('./svg', false, /.svg$/)

手摸手,优雅实现vue中使用 svg-icon相关推荐

  1. 手摸手,带你用vue撸后台 系列一(基础篇) - 掘金

    完整项目地址:vue-element-admin 系列文章: 手摸手,带你用 vue 撸后台 系列一(基础篇) 手摸手,带你用 vue 撸后台 系列二(登录权限篇) 手摸手,带你用 vue 撸后台 系 ...

  2. vue 前端显示图片加token_手摸手,带你用vue撸后台 系列二(登录权限篇)

    完整项目地址:vue-element-admin https://github.com/PanJiaChen/vue-element-admin 前言 拖更有点严重,过了半个月才写了第二篇教程.无奈自 ...

  3. editor修改样式 vue_手摸手Electron + Vue实战教程(三)

    系列文章: 手摸手Electron + Vue实战教程(一) 手摸手Electron + Vue实战教程(二) ❝ 上一篇我们已经完成了左侧菜单栏的基本样式功能,这一篇我们就主要来开发右侧的Markd ...

  4. 手摸手带你用实现vue全屏loading插件

    手摸手带你用实现vue全屏loading插件 前言: 由于我们打开网页时,浏览器与服务器交互需要时间,受限于宽带以及服务器性能,导致用户在访问一个网页时,往往需要一个等待期,才能在浏览器中真正完全展示 ...

  5. 带你手摸手搭建vuepress站点

    vuePress是什么? VuePress 俺简单介绍下,是国内有名大神的尤雨溪发布的全新基于 vue 静态网站的生成器,内置的有 webpack组件,可以拿来写文档,主要是md格式.做出的感觉就是简 ...

  6. 微信小程序开发❤手摸手撸小程序一篇就够!

    手摸手撸小程序!!超简单,一篇就够! 微信小程序介绍 微信小程序,简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用 ...

  7. 快应用之手摸手,跟我走(1)

    快应用发布快两周啦.这两天有空,就捣鼓了一个快应用.整体感觉来说,交互很流畅,基本功能和组件都有.上手也很快.希望官网推广能做好.好了,话不多说,先上 gitHub (传送门) gankQuick-快 ...

  8. 招聘行业颠覆者【伯小乐】| 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 作者微信:weihe2416 "伯小乐" 是 ...

  9. 短视频Gif快手-有点意思 | 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告.                                 ...

  10. IN-我的生活in记 | 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 引言 IN是一款基于女性和品牌的时尚品位分享移动端社区,以图片社 ...

最新文章

  1. 一致性哈希算法以及其PHP实现
  2. 关于整型数据符号位扩展的问题
  3. 49天备考信息系统项目管理师3科50+
  4. Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码
  5. 深度学习中用到的一些函数
  6. 随想录(使用堆栈回溯函数调试代码)
  7. 图像形态学运算之腐蚀-膨胀篇
  8. 没解决:MMC不能打开文件MSC可能是由于文件不存在,不是一个MMC控制台,或者用后来的MMC版本创建。也可能你没有访问此文件的足够权限
  9. 数学表达式: 从恐惧到单挑 (1. 概述)
  10. 发送到谷歌邮箱的邮件在哪找_如何让Google表格为您发送个性化电子邮件
  11. matlab画图五角星标记,Matlab---画图线型、符号及颜色
  12. 哈希(哈希表与哈希函数)
  13. switch 和 break 用法
  14. 推动RISC-V拾级而上 赛昉科技发布两款高性能产品: JH7110多媒体处理器与VisionFive 2开发板
  15. 圆珠笔芯为什么那么细
  16. 独享ip和共享ip的区别
  17. 计算公式(java实现)
  18. 成都本地的伪装成科技公司的培训机构对照表(全)
  19. LabVIEW生成.NET的DLL——C#下调用NI数据采集设备功能的一种方法 [原创www.cnblogs.com/helesheng]
  20. c语言求一到一百奇数乘积,C语言学习之求1到100之间奇数和

热门文章

  1. C - Bouncing Ball
  2. 我的VIM配置--工欲善其事必先利其器
  3. 关于AI算法工程师成长路径
  4. 在滴滴和字节跳动干了 2 年测试开发,太真实…
  5. iphone html 缩放,html-防止iPhone缩放表格?
  6. 纺织污水处理中PLC远程监控的应用
  7. 计算机软件必须定期更换,2012河南会计电算化判断题库01
  8. php workerman怎么样,workerman的工作效率好不好
  9. 计算机二级c语言指针,2010年计算机等级考试二级C语言一维数组与指针2
  10. 笔记10:Carla官方文档阅读 -- 2nd【Actors and Blueprints】/【(3)Types of Actors】/【5)Walkers】