在项目中经常要使用各种各样的icon,特别对我这种有点强迫症的人来说,挑选一个icon经常要换个好几遍,当使用ui框架的时候,比如element、iview,使用他们框架自带的icon确实很方便简单,但是ui框架的icon经常感觉不够用,不符合自己的需求,特别是element,icon太少了。
那如何拓展我们的icon选择呢,相信很多人都知道阿里的 iconfont网站
里面的图标可以说是应有尽有,但如何在我们的项目中引用才是关键,接下来我将一步一步介绍如何在项目中引用iconfont的图标。
-
挑选图标至自己的项目,生成symbol类型js代码:
image.png
点击生成代码,会出现一个网址,复制这个网址在浏览器中打开
image.png -
复制生成的js代码复制到项目中的iconfont.js文件
image.png -
在main.js中引入这个js文件
import './base/iconfont.js' // 你的文件路径
- 创建Icon组件
<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: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
到这一步就封装好一个简单的icon组件,使用Symbol格式的icon有什么特点和好处大家可以看看 官网的解释
但这个组件从外面使用只是传入一个 iconClass,为了更方便些,我们多操作些属性:
(1)icon的大小,我这边默认是长宽一样,所以接收一个size设置宽和高。
(2)icon的字体颜色,需要注意的,使用Symbol是支持多色图标的。
(3)icon是否开启鼠标样式,变成小手状
添加几个属性后的Icon组件:
<template>
<svg class="svg-icon"
aria-hidden="true"
:style="{color:color,width:size,height:size,cursor:pointer?'pointer':'default'}"
>
<use :xlink:href="iconName"></use>
</svg>
</template>
<script>
export default {
name: 'icon-svg',
props: {
iconClass: {
type: String,
required: true
},
color: { // 字体颜色
type: String,
default: '#000'
},
size: {
type: String,
default: '20px'
},
pointer: { // 默认不开启鼠标手状
type: Boolean,
default: false
}
},
computed: {
iconName () {
return `#icon-${this.iconClass}`
}
}
}
</script>
<style>
.svg-icon {
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
- 全局注册Icon组件
在main.js中引入和注册:
// 引入
import Icon from '@/components/Common/Icon'
// 全局注册
Vue.component('Icon', Icon)
- 使用
通过全局注册后我们在其他组件都可以使用Icon组件,接着上面说到的往Icon组件传入一个iconClass,这个iconclass是从哪里来的呢,我们回到iconfont的官网的项目中,选择图标复制代码:
image.png
因为我在Icon组件中处理了iconName,使用iconClass不用带icon-前缀
在组件中使用:
<Icon iconClass="yazi"></Icon>
效果:
image.png
这样就完成了一个Icon组件的封装,可以随心所欲的使用iconfont上面的图标,最后需要注意的两点:
- 回到第一步,将你iconfont中项目的图标生成js代码的时候,如果你新增了图标,就需要重新生成js代码,然后复制替换你vue项目中iconfont.js代码,这样你新增的图标才能看到效果。
- 当你给图标绑定点击事件时,正常业务都会绑定在Icon组件上,因为是抽离成一个组件,所以需要加一个native修饰符:
<Icon iconClass="yazi" @click.native="handleClick"></Icon>
网友评论