我是靠谱客的博主 安详小笼包,这篇文章主要介绍【VUE】Icon插件封装,现在分享给大家,希望可以做个参考。

本地Svg抽象为Icon全局组件,让Icon使用更加优雅,参考手摸手,带你优雅的使用 icon

文章目录

    • IconSvg组件
    • SVG文件自动引入
    • 制作svg-sprite

IconSvg组件

在components文件夹下增加IconSvg文件夹,文件夹中增加index.vue,这里主要定义组件。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<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>
复制代码
1
2
3
4
5
6
7
8
@/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中内容如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{ 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

复制代码
1
2
import './icons' // icon 引入icons文件夹下所有的icon

到这里就可以直接在代码中直接使用 来引入一个svg图片,只需要修改icon-class为当前svg的名称即可。

复制代码
1
2
3
4
<icon-svg icon-class="github" /> <icon-svg icon-class="wechat" /> <icon-svg icon-class="qq" />

效果:
在这里插入图片描述

最后

以上就是安详小笼包最近收集整理的关于【VUE】Icon插件封装的全部内容,更多相关【VUE】Icon插件封装内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部