封装全局icon组件 svg (仿造element-ui源码)
2019-01-08 08:23:05来源:博客园 阅读 ()
一、引入 svg-sprite-loader 插件
npm install svg-sprite-loader --save-dev
vue-cli项目默认情况下会使用 url-loader 对svg进行处理,会将它放在/img 目录下,所以这时候我们引入svg-sprite-loader 会引发一些冲突。
//默认`vue-cli` 对svg做的处理,正则匹配后缀名为.svg的文件,匹配成功之后使用 url-loader 进行处理。 { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } }
解决方案:使用 webpack 的 exclude和 include,让svg-sprite-loader只处理你指定文件夹下面的 svg,url-loaer只处理除此文件夹之外的所以 svg,这样就完美解决了之前冲突的问题。对配置文件进行以下修改:
{ test: /\.svg$/, loader: 'svg-sprite-loader', include:[resolve('src/assets/icons')], options: { symbolId: 'icon-[name]', name: utils.assetsPath('img/[name].[hash:7].[ext]') } }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', exclude:[resolve('src/assets/icons')], options: { limit: 10000, name: utils.assetsPath('img/[name].[hash:7].[ext]') } },
二、建立全局组件
建立vue-cli项目,在src/components下建立icon-svg.vue文件。
<template> <svg class="svg-icon" aria-hidden="true"> <use :xlink:href="iconName"></use> </svg> </template> <script> export default { name: 'icon-svg', props: { iconClass: { type: String, required: true } }, computed: { iconName() { return `#icon-${this.iconClass}` // 与配置文件的配置格式一致 } } } </script> <style> .svg-icon { width: 50px; height: 50px; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } </style>
在入口文件全局注册组件
//引入svg组件 import IconSvg from '@/components/icon-svg' //全局注册icon-svg Vue.component('icon-svg', IconSvg)
操作完成之后就可以在vue文件中使用svg图标了:
import '@/assets/icons/attach_excel.svg'; //引入图标 直接使用 <svg><use xlink:href="#icon-attach_excel"/></svg> 全局组件形式使用 <icon-svg iconClass="attach_excel"></icon-svg>
三、添加自动导入svg文件
之后我们就要使用到 webpack 的 require.context:
require.context("./test", false, /.test.js$/); 这行代码就会去 test 文件夹(不包含子目录)下面的找所有文件名以 .test.js 结尾的文件能被 require 的文件。 即我们可以通过正则匹配引入相应的文件模块。
require.context有三个参数:
- directory:说明需要检索的目录
- useSubdirectories:是否检索子目录
- regExp: 匹配文件的正则表达式
接下来可以在入口文件这样写,来自动引入 @/src/icons 下面所有的图标:
const requireAll = requireContext => requireContext.keys().map(requireContext) const req = require.context('@/assets/icons', true, /\.svg$/) requireAll(req)
vue文件直接使用:
<icon-svg iconClass="attach_excel"></icon-svg>
参考网址:https://segmentfault.com/a/1190000012213278
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:js中常用的算法排序
- 创建全局组件的三种方式 2019-08-14
- vue学习【一】vue引用封装echarts并展示多个echarts图表 2019-08-14
- 三、VUE项目BaseCms系列文章:axios 的封装 2019-08-14
- 前端js性能优化的要点 2019-08-14
- JS函数 2019-08-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash