前言
在项目中常遇到使用图标的地方,找了许多解决方式,最终还是选择了iconfont图标作为常用图标库。
但是在实际开发当中,使用iconfont提供的开发方式有诸多不便的地方。例如当需要新增一个图标是,需要更新在线链接,然后再将项目当中的链接替换。
接下来记录一次如何在vue中封装icon,更高效的使用icon。
本篇文章取自:手摸手,带你优雅的使用 icon
封装组件
首先让我们先创建一个公共组件icon
的单页文件
<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文件全部导入
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的文件
//默认`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
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内容请搜索靠谱客的其他文章。
发表评论 取消回复