概述
本地Svg抽象为Icon全局组件,让Icon使用更加优雅,参考手摸手,带你优雅的使用 icon
文章目录
- IconSvg组件
- SVG文件自动引入
- 制作svg-sprite
IconSvg组件
在components文件夹下增加IconSvg文件夹,文件夹中增加index.vue,这里主要定义组件。
<template>
// 支持使用外链的形式引入 svg。例如:<svg-icon icon-class="https://xxxx.svg />
<div v-if="isExternal"
:style="styleExternalIcon"
class="svg-external-icon svg-icon"
v-on="$listeners" />
<svg v-else class="svg-icon" aria-hidden="true" v-on="$listeners">
<use :xlink:href="iconName"></use>
</svg>
</template>
<script>
import { isExternal } from '@/utils/index.js'
export default {
name: 'icon-svg',
props: {
iconClass: {
type: String,
required: true
},
className: {
type: String,
default: ''
}
},
computed: {
isExternal() {
return isExternal(this.iconClass)
},
iconName() {
return `#icon-${this.iconClass}`
},
svgClass() {
if (this.className) {
return 'svg-icon ' + this.className
} else {
return 'svg-icon'
}
},
styleExternalIcon() {
return {
mask: `url(${this.iconClass}) no-repeat 50% 50%`,
'-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
}
}
},
}
</script>
<style>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: center;
fill: currentColor;
overflow: hidden;
}
.svg-external-icon {
background-color: currentColor;
mask-size: cover!important;
display: inline-block;
}
</style>
@/utils/index.js
* @param {string} path
* @returns {Boolean}
*/
export function isExternal(path) {
return /^(https?:|mailto:|tel:)/.test(path)
}
xlink:href 中传入 svg ID 就好了,由于在上面的配置文件中我们直接使用文件名作为 symbol 的 ID,所以这里传入的 ID 即为你想显示的图标的 svg 文件名
SVG文件自动引入
vue项目中src目录下增加icons文件夹:本地svg、入口文件index.js
index.js中内容如下:
// index.js
import Vue from 'vue'
import SvgIcon from '@/components/IconSvg'// 引入svg组件
// 注册全局组件
Vue.component('svg-icon', IconSvg)
// 自动引入svg文件夹下所有.svg文件
/* require.context,通过正则匹配到可能的文件,全部引入
require.context(directory, useSubdirectories, regExp ):
- directory:说明需要检索的目录
- useSubdirectories:是否检索子目录
- regExp: 匹配文件的正则表达式
*/
const req = require.context('./svg', false, /.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
制作svg-sprite
使用插件svg-sprite-loader: webpack loader ,可以将多个 svg 打包成 svg-sprite。
vue-cli默认情况下会使用url-loader对svg进行处理,会将它放在/img目录下,所以这时候我们使用webpack配置进行修改。
修改webpack.base.conf.js
{
test: /.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons')],
options: {
symbolId: 'icon-[name]'
}
},
{
test: /.(png|jpe?g|gif|svg)(?.*)?$/,
loader: 'url-loader',
exclude: [resolve('src/icons')],
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
webpack添加处理svg的loader,第一个用来处理svg的,第二个是去除svg处理的。
main.js中导入icons
import './icons' // icon 引入icons文件夹下所有的icon
到这里就可以直接在代码中直接使用 来引入一个svg图片,只需要修改icon-class为当前svg的名称即可。
<icon-svg icon-class="github" />
<icon-svg icon-class="wechat" />
<icon-svg icon-class="qq" />
效果:
最后
以上就是安详小笼包为你收集整理的【VUE】Icon插件封装的全部内容,希望文章能够帮你解决【VUE】Icon插件封装所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复