vue中封装一个icon组件

在项目中经常要使用各种各样的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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容