<template> <svg :class="svgClass" aria-hidden="true" :color="svgColor" > <use :xlink:href="iconName" /> </svg> </template> <script lang="ts"> import { Component, Vue, Prop } from 'vue-property-decorator'; @Component({ components: {} }) export default class SvgIcon extends Vue { @Prop({ default: null, type: String }) iconClass!: String; @Prop({ default: '', type: String }) className!: String; @Prop({ default: null, type: String }) svgColor!: String; get iconName() { return `#icon-${this.iconClass}`; } get svgClass() { if (this.className) return `svg-icon ${this.className}`; return 'svg-icon'; } } </script> <style scoped> .svg-icon { width: 2em; height: 2em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } </style>
@/src/icons
下面全部的圖標了
require.context
可能比較陌生,直白的解釋就是
.test.js
結尾的文件能被 require 的文件。 更直白的說就是 咱們能夠經過正則匹配引入相應的文件模塊。
import Vue from 'vue'; import IconSvg from '@/components/IconSvg/IconSvg.vue'; // 全局註冊icon-svg Vue.component('icon-svg', IconSvg); // requires and returns all modules that match const requireAll = requireContext => requireContext.keys().map(requireContext); // import all svg const req = require.context('./svg', true, /\.svg$/); requireAll(req);
svg-sprite
。vue-cli
默認狀況下會使用 url-loader
對svg進行處理,會將它放在/img
目錄下,因此這時候咱們引入svg-sprite-loader
會引起一些衝突。//默認`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]') } }
svg-sprite-loader
只處理你指定文件夾下面的 svg,url-loaer
只處理除此文件夾以外的因此 svg,這樣就完美解決了以前衝突的問題。 代碼以下module.exports = { lintOnSave: true, baseUrl: './', productionSourceMap: process.env.NODE_ENV !== 'production', chainWebpack: (config) => { config.resolve.alias.set('@images', resolve('./src/assets/images')); config.resolve.alias.set('@svg', resolve('./src/icons/svg')); config.module.rules.delete('svg'); // 重點:刪除默認配置中處理svg, config.module .rule('svg-sprite-loader') .test(/\.svg$/) .include .add(resolve('src/icons/svg')) // 處理svg目錄 .end() .use('svg-sprite-loader') .loader('svg-sprite-loader') .options({ symbolId: 'icon-[name]', }); }, ......
這樣配置好了,開始使用了.html
<icon-svg icon-class="send" className="icon"
/>
效果vue
參考連接: 手摸手,帶你優雅的使用 iconwebpack
更詳細的 能夠去看看上面連接,大神帶你飛web