美文网首页
vue中封装一个icon组件

vue中封装一个icon组件

作者: 超人鸭 | 来源:发表于2019-10-22 17:26 被阅读0次

    在项目中经常要使用各种各样的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>
    

    相关文章

      网友评论

          本文标题:vue中封装一个icon组件

          本文链接:https://www.haomeiwen.com/subject/sgnqvctx.html