在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 相关文章推荐
js动态修改input输入框的type属性(实现方法解析)
Nov 13 Javascript
JS Loading功能的简单实现
Nov 29 Javascript
Js+Jq获取URL参数的集中方法示例代码
May 20 Javascript
js中的如何定位固定层的位置
Jun 15 Javascript
JavaScript动态改变div属性的实现方法
Jul 22 Javascript
javascript实现在指定元素中垂直水平居中
Sep 13 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
Nov 16 Javascript
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
Jun 01 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
Oct 23 Javascript
Vue2.0+ElementUI实现表格翻页的实例
Oct 23 Javascript
vue+springmvc导出excel数据的实现代码
Jun 27 Javascript
微信小程序实现图片上传放大预览删除代码
Jun 28 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
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
PHP利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
php截取中文字符串函数实例
2015/02/23 PHP
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
Web前端框架Angular4.0.0 正式版发布
2017/03/28 Javascript
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python中 Lambda表达式全面解析
2016/11/28 Python
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
简单实现Python爬取网络图片
2018/04/01 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
python从zip中删除指定后缀文件(推荐)
2019/12/05 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
日本网路线上商品代购服务:转送JAPAN
2016/08/05 全球购物
特步官方商城:Xtep
2017/03/21 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
班长自荐书范文
2014/02/11 职场文书
校优秀毕业生主要事迹
2014/05/26 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
六一活动主持词
2015/06/30 职场文书
七一慰问简报
2015/07/20 职场文书
感恩的心主题班会
2015/08/12 职场文书
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL