vue项目封装icon

前言

在项目中常遇到使用图标的地方,找了许多解决方式,最终仍是选择了iconfont图标做为经常使用图标库。css

可是在实际开发当中,使用iconfont提供的开发方式有诸多不便的地方。例如当须要新增一个图标是,须要更新在线连接,而后再将项目当中的连接替换。html

接下来记录一次如何在vue中封装icon,更高效的使用icon。vue

本篇文章取自:手摸手,带你优雅的使用 iconwebpack

封装组件

首先让咱们先建立一个公共组件icon的单页文件git

<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文件所有导入github

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的文件web

//默认`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文件夹中,不作任何优化处理。vue-cli

这里就要介绍一种svg加载器了。bash

svg-sprite-loadersvg

该加载器能帮咱们将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>

相关文章
相关标签/搜索