在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 相关文章推荐
几个比较经典常用的jQuery小技巧
Mar 01 Javascript
jQuery判断元素是否是隐藏的代码
Apr 24 Javascript
JS中的prototype与面向对象的实例讲解
May 22 Javascript
javascript中如何处理引号编码&amp;#034;
Aug 15 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
Jun 09 jQuery
jQuery复合事件结合toggle()方法的用法示例
Jun 10 jQuery
vue router路由嵌套不显示问题的解决方法
Jun 17 Javascript
快速处理vue渲染前的显示问题
Mar 05 Javascript
纯js封装的ajax功能函数与用法示例
May 14 Javascript
js实现延迟加载的几种方法详解
Jan 19 Javascript
javascript实现blob加密视频源地址的方法
Aug 08 Javascript
vue+Element中table表格实现可编辑(select下拉框)
May 21 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
谈一谈收音机的高放电路
2021/03/02 无线电
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
Javascript 继承实现例子
2009/08/12 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
一篇不错的Python入门教程
2007/02/08 Python
go和python调用其它程序并得到程序输出
2014/02/10 Python
python学习之面向对象【入门初级篇】
2017/01/21 Python
Python数据持久化shelve模块用法分析
2018/06/29 Python
Python中最大递归深度值的探讨
2019/03/05 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
html5 canvas-2.用canvas制作一个猜字母的小游戏
2013/01/07 HTML / CSS
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
大学生实习感言
2014/01/16 职场文书
学生周末回家住宿长期请假条
2014/02/15 职场文书
市场营销策划方案
2014/06/11 职场文书
医学生求职自荐书
2014/06/12 职场文书
招标授权委托书样本
2014/09/23 职场文书
幼儿园感谢信
2015/01/21 职场文书
党支部工作总结2015
2015/04/01 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书