我是靠谱客的博主 开心黑米,这篇文章主要介绍vue项目封装icon,现在分享给大家,希望可以做个参考。

前言

在项目中常遇到使用图标的地方,找了许多解决方式,最终还是选择了iconfont图标作为常用图标库。

但是在实际开发当中,使用iconfont提供的开发方式有诸多不便的地方。例如当需要新增一个图标是,需要更新在线链接,然后再将项目当中的链接替换。

接下来记录一次如何在vue中封装icon,更高效的使用icon。

本篇文章取自:手摸手,带你优雅的使用 icon

封装组件

首先让我们先创建一个公共组件icon的单页文件

复制代码
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
<template> <svg :class="svgClass" aria-hidden="true"> <use :xlink:href="iconClass"></use> </svg> </template> <script> export default { name: "svgClass", props: { // 使用icon的图标类型 iconName: { type: String, required: true, }, // 是否添加class样式 className: { type: String, default: "" } }, computed: { iconClass() { return `#icon-${this.iconName}`; }, svgClass() { if (this.className) { return `icon ${this.className}`; } else { return `icon`; } } } }; </script> <style type="text/css" scoped> .icon { width: 1em; height: 1em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } </style> 复制代码

文件导入

编写完这个单页文件之后还不算结束,然后需要将该组件注册为全局组件,同时需要将使用到的svg图标导入到项目中,在这里我使用将svg文件中的所有.svg文件全部导入

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
import Vue from 'vue'; // 引入写好的icon组件 import icon from '@/components/icon'; // 注册到全局组件 Vue.component('icon', icon) // 将./svg下不包括子目录的所有后缀名.svg的文件赋值给变量req const requireContext = require.context('./svg', false, /.svg$/) // 函数 全部导入 const importAll = r => r.keys().map(r) importAll(requireContext) 复制代码

添加 svg-sprite-loader

因为是用了文件导入的方式,那么就要使用加载器了,vue-cli脚手架其实已经帮我们处理了.svg的文件

复制代码
1
2
3
4
5
6
7
8
9
10
//默认`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]') } } 复制代码

但是这种默认处理方式已经不适用了,这种默认的方式仅仅帮我们打包在了img文件夹中,不做任何优化处理。

这里就要介绍一种svg加载器了。

svg-sprite-loader

该加载器能帮我们将svg嵌入在单页应用中,在html开头动态导入所添加的svg文件

接下来添加 svg-sprite-loader

这里我使用的是vue-cli3版本,首先创建vue.config.js

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module.exports = { // 链表式webpack属性 chainWebpack: config => { // 修改内部svg规则 const svg = config.module.rule("svg"); svg.exclude.add(resolve("src/icons")).end(); // 新增规则,use为规则命名,loader表示使用的加载器,tap表示配置选项 const svgSpriteLoader = config.module.rule("svg-sprite"); svgSpriteLoader .test(/.svg$/) .include.add(resolve("src/icons/svg")) .end() .use("svg-sprite-loader") .loader("svg-sprite-loader") .options({ symbolId: "icon-[name]" }); } } 复制代码

意思表示,svg默认加载器提取目录排除src/icon。添加 svg-sprite-loader 提取只限src/icons/svg目录,生成的svg格式名为icon-[name]

使用方式

做完上诉工作之后,接下来就是使用了。

使用起来非常简单,代码如下:

<icon :iconName="icon-name"></icon>

转载于:https://juejin.im/post/5cac0164f265da0374185766

最后

以上就是开心黑米最近收集整理的关于vue项目封装icon的全部内容,更多相关vue项目封装icon内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部