vue中封装一个icon组件

3,761 阅读2分钟

在项目中经常要使用各种各样的icon,特别对我这种有点强迫症的人来说,挑选一个icon经常要换个好几遍,当使用ui框架的时候,比如element、iview,使用他们框架自带的icon确实很方便简单,但是ui框架的icon经常感觉不够用,不符合自己的需求,特别是element,icon太少了。 那如何拓展我们的icon选择呢,相信很多人都知道阿里的 iconfont网站

image.png
里面的图标可以说是应有尽有,但如何在我们的项目中引用才是关键,接下来我将一步一步介绍如何在项目中引用iconfont的图标。

  1. 挑选图标至自己的项目,生成symbol类型js代码:

    image.png
    点击生成代码,会出现一个网址,复制这个网址在浏览器中打开
    image.png

  2. 复制生成的js代码复制到项目中的iconfont.js文件

    image.png

  3. 在main.js中引入这个js文件

import './base/iconfont.js'   // 你的文件路径
  1. 创建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>
  1. 全局注册Icon组件 在main.js中引入和注册:
// 引入
import Icon from '@/components/Common/Icon'
// 全局注册
Vue.component('Icon', Icon)
  1. 使用 通过全局注册后我们在其他组件都可以使用Icon组件,接着上面说到的往Icon组件传入一个***iconClass***,这个iconclass是从哪里来的呢,我们回到iconfont的官网的项目中,选择图标复制代码:
    image.png
    因为我在Icon组件中处理了iconName,使用iconClass不用带***icon-***前缀 在组件中使用:
<Icon iconClass="yazi"></Icon>

效果:

image.png
这样就完成了一个Icon组件的封装,可以随心所欲的使用iconfont上面的图标,最后需要注意的两点:

  1. 回到第一步,将你iconfont中项目的图标生成js代码的时候,如果你新增了图标,就需要重新生成js代码,然后复制替换你vue项目中iconfont.js代码,这样你新增的图标才能看到效果。
  2. 当你给图标绑定点击事件时,正常业务都会绑定在Icon组件上,因为是抽离成一个组件,所以需要加一个***native***修饰符:
<Icon iconClass="yazi" @click.native="handleClick"></Icon>