在vue项目中优雅的使用SVG的方法实例详解


Posted in Javascript onDecember 03, 2018

1、基础介绍

本文旨在介绍如何在项目中配置和方便的使用svg图标。
本文以vue项目为例,当然在react中的使用原理基本相似。
svg图标可以直接通过img标签来使用,也可当做icon来使用。
本文是参考了鑫旭大佬的文章:SVG Sprite技术介绍。

2、配置

安装svg-sprite-loader。通过vue-cli脚手架创建的项目默认情况下会使用 url-loader 对svg进行处理,所以需要处理下:

{
 test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
 loader: 'url-loader',
 options: {
  limit: 10000,          
  name: utils.assetsPath('img/[name].[hash:7].[ext]')
 }
}

cnpm i -D svg-sprite-loader。在static下新建svg文件夹,用来放置当做icon使用的svg,使用include,include和img做区分。然后修改webpack.base.conf.js配置,这样svg-sprite-loader只会处理我们指定的static/svg下的文件:

{
 test: /\.svg$/,
 loader: 'svg-sprite-loader',
 include: [resolve('static/svg')], // include => 只处理指定的文件夹下的文件
 options: {
  symbolId: 'icon-[name]'
 }
 },
 {
 test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
 loader: 'url-loader',
 exclude: [resolve('static/svg')], // exclude => 不处理指定的文件夹下的文件
 options: {
  limit: 10000,
  name: utils.assetsPath('img/[name].[hash:7].[ext]')
 }
 }

3、使用

在components下创建svg文件夹,创建Svg.vue文件:

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

在utils文件夹下创建svgConfig文件夹,创建index.js文件,全局注册svg-icon组件。

Vue.component('svg-icon', SvgIcon)

使用require.context自动导入文件,而不需要import一个个去引用:

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

在vue项目中优雅的使用SVG的方法实例详解

4. 在main.js在执行:

import '@/utils/svgConfig'

到此我们就可以直接在项目中使用:

<svg-icon icon-class="users" />

4、优化

虽然现在已经可以使用svg-icon,当是还无法直观的分辨svg,当svg文件比较多的时候,如果只能一个个的去查找将费时费力。为方便我们查找和使用svg,可以新建一个svg的列表页。

在pages文件下新建SvgList.vue文件,iconsMap为导入的svg文件数组,handleClipboard方法为点击复制的方法,通过安装clipboard实现(cnpm i -S clipboard):

<div class="icons-wrapper">
 <div v-for="item in iconsMap" :key="item" @click="handleClipboard(generateIconCode(item), $event)">
 <el-tooltip placement="top">
  <div slot="content">
  {{generateIconCode(item)}}
  </div>
  <div class="icon-item">
  <div>
   <span class="svg-wrap" @click.stop>
   <svg-icon :icon-class="item" />
   </span>
  </div>
  <span>{{item}}</span>
  </div>
 </el-tooltip>
 </div>
</div>

获取iconsMap,在utils文件夹下创建svgConfig文件夹,generateIconsView.js文件, 当然如果你使用了vuex,也可以保存在vuex中的state中:

const data = {
 state: {
 iconsMap: []
 },
 generate (iconsMap) {
 this.state.iconsMap = iconsMap
 }
}
export default data

将数据保存在iconsMap中:

在vue项目中优雅的使用SVG的方法实例详解

在SvgList.vue中使用:

<script>
import icons from '@/utils/svgConfig/generateIconsView'
export default {
 name: 'icons',
 data () {
 return {
  iconsMap: []
 }
 },
 mounted () {
 const iconsMap = icons.state.iconsMap.map((i) => {
  return i.default.id.split('-')[1]
 })
 this.iconsMap = iconsMap
 }
}
</script>

添加点击复制的提示和方法(cnpm i -S clipboard),在SvgList.vue中使用:

methods: {
 generateIconCode (symbol) {
  return `<svg-icon icon-class="${symbol}" />`
 },
 handleClipboard (text, event) {
  clipboard(text, event)
 }
}

在路由添加SvgList.vue的路由信息,页面效果如下:

在vue项目中优雅的使用SVG的方法实例详解

总结

以上所述是小编给大家介绍的在vue项目中优雅的使用SVG的方法实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript学习心得之概述
Jan 20 Javascript
浅析Bootstrap缩略图组件与警示框组件
Apr 29 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
Dec 02 Javascript
JavaScript 巧学巧用
May 23 Javascript
Javascript中Promise的四种常用方法总结
Jul 14 Javascript
JavaScript requestAnimationFrame动画详解
Sep 14 Javascript
layui框架table 数据表格的方法级渲染详解
Aug 19 Javascript
Angular使用cli生成自定义文件、组件的方法
Sep 04 Javascript
详解如何构建一个Angular6的第三方npm包
Sep 07 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
Jan 15 Javascript
微信小程序从注册账号到上架(图文详解)
Jul 17 Javascript
JavaScript提升机制Hoisting详解
Oct 23 Javascript
React事件处理的机制及原理
Dec 03 #Javascript
JointJS流程图的绘制方法
Dec 03 #Javascript
微信小程序之事件交互操作实例分析
Dec 03 #Javascript
vue-better-scroll 的使用实例代码详解
Dec 03 #Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
Dec 03 #Javascript
Vue.js 图标选择组件实践详解
Dec 03 #Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
Dec 03 #Javascript
You might like
CentOS 6.3下安装PHP xcache扩展模块笔记
2014/09/10 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
extjs fckeditor集成代码
2009/05/10 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
JS常用函数使用指南
2014/11/23 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
Python中的类与类型示例详解
2019/07/10 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
增大python字体的方法步骤
2020/07/05 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
瑞典多品牌连锁店:Johnells
2021/01/13 全球购物
函授药学自我鉴定
2014/02/07 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
世界读书日的活动方案
2014/08/20 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
晚会开幕词
2015/01/28 职场文书
八年级语文教学反思
2016/03/03 职场文书