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 相关文章推荐
JavaScript 在各个浏览器中执行的耐性
Apr 06 Javascript
jQuery解决iframe高度自适应代码
Dec 20 Javascript
Jquery简单实现GridView行高亮的方法
Jun 15 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
May 26 Javascript
详解JS数组Reduce()方法详解及高级技巧
Aug 18 Javascript
vue计算属性及使用详解
Apr 02 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
May 04 Javascript
浅析Vue 生命周期
Jun 21 Javascript
详解微信小程序input标签正则初体验
Aug 18 Javascript
vue使用v-for实现hover点击效果
Sep 29 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
May 29 jQuery
微信小程序用户授权最佳实践指南
May 08 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
一个比较不错的PHP日历类分享
2014/11/18 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
vue项目实战总结篇
2018/02/11 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
[41:05]Serenity vs Pain 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
Python随机生成彩票号码的方法
2015/03/05 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
python实现加密的方式总结
2020/01/19 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
Pytorch转tflite方式
2020/05/25 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
市场营销方案范文
2014/03/11 职场文书
学习经验交流会总结
2015/11/02 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript
python简单验证码识别的实现过程
2021/06/20 Python
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS