vue项目中使用Svg的方法


Posted in Javascript onOctober 24, 2018

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的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
让div层随鼠标移动的实现代码 ie ff
Dec 18 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
Nov 30 Javascript
js遍历、动态的添加数据的小例子
Jun 22 Javascript
jQuery 判断图片是否加载完成方法汇总
Aug 10 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
Mar 04 Javascript
简单实现IONIC购物车功能
Jan 10 Javascript
webpack入门必知必会
Jan 16 Javascript
ES6新特性之模块Module用法详解
Apr 01 Javascript
js实现复制功能(多种方法集合)
Jan 06 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
Oct 09 Javascript
详解vue-router导航守卫
Jan 19 Javascript
Vue中的transition封装组件的实现方法
Aug 13 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
Oct 24 #Javascript
小程序云开发初探(小结)
Oct 24 #Javascript
vue-cli V3.0版本的使用详解
Oct 24 #Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
Oct 24 #Javascript
vue 属性拦截实现双向绑定的实例代码
Oct 24 #Javascript
深入理解JavaScript的值传递和引用传递
Oct 24 #Javascript
详解JavaScript中typeof与instanceof用法
Oct 24 #Javascript
You might like
关于svn冲突的解决方法
2013/06/21 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
Yii2框架实现注册和登录教程
2016/09/30 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
一个css与js结合的下拉菜单支持主流浏览器
2014/10/08 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
在Python中进行自动化单元测试的教程
2015/04/15 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
Python list运算操作代码实例解析
2020/01/20 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
python opencv肤色检测的实现示例
2020/12/21 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
2015年乡镇发展党员工作总结
2015/03/31 职场文书
二审代理词范文
2015/05/25 职场文书
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS