前言
在專案中常遇到使用圖示的地方,找了許多解決方式,最終還是選擇了iconfont圖示作為常用圖示庫。
但是在實際開發當中,使用iconfont提供的開發方式有諸多不便的地方。例如當需要新增一個圖示是,需要更新線上連結,然後再將專案當中的連結替換。
接下來記錄一次如何在vue中封裝icon,更高效的使用icon。
本篇文章取自:手摸手,帶你優雅的使用 icon
封裝元件
首先讓我們先建立一個公共元件icon
的單頁檔案
<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檔案全部匯入
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的檔案
//預設`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檔案中,不做任何優化處理。
這裡就要介紹一種svg載入器了。
該載入器能幫我們將svg嵌入在單頁應用中,在html開頭動態匯入所新增的svg檔案
接下來新增 svg-sprite-loader
首先建立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="svg-name"></icon>