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>

相關文章
相關標籤/搜索