基於Vue實現自定義組件的方式引入圖標
前言
在項目開發中,使用圖標的方式有很多種,可以在iconfont上面找到合適的圖標,通過http或者直接下載使用,這裡我分享一種通過實現自定義組件的方式引入圖標。
搭建環境
這裡通過@vue/cli 4.5.13新建項目,並且需要安裝依賴svg-sprite-loader,用來處理對應的svg圖標,方便我們使用。
安裝: npm install --save-dev svg-sprite-loader
配置vue.config.js
在安裝svg-sprite-loader後,新建vue.config.js來配置依賴:
// vue.config.js const { resolve } = require('path') module.exports = { chainWebpack(config) { config .module .rule('svg') .exclude .add(resolve('src/icons')) .end() config .module .rule('icons') .test(/\.svg$/) .include .add(resolve('src/icons')) .end() .use('svg-sprite-loader') .loader('svg-sprite-loader') .options({ symbolId: 'icon-[name]' }) } }
這裡通過chainWebpack來做瞭兩項配置:
- 第一個是讓原來的其他處理svg的依賴不處理src/icons下我們的自定義圖標文件
- 通過svg-sprite-loader來處理自定義的圖標文件,options裡面的設置表示,生成的svg的symbolId為icon和文件名的拼接。
新建圖標組件
在components目錄下新建一個SvgIcon.vue文件:
<template> <i class="icon"> <!-- aria-hidden, 幫助殘障人士閱讀(設備讀取內容時會跳過這個標簽以免混淆) --> <svg aria-hidden="true" :width="size" :height="size" :fill="fillColor"> <use :xlink:href="iconName" rel="external nofollow" ></use> </svg> </i> </template> <script lang="ts"> import { PropType, toRefs } from 'vue' export default { props: { size: { type: Number as PropType<number>, default: 14 }, fillColor: { type: String as PropType<string>, default: '#000' }, iconName: { type: String as PropType<string>, required: true } }, setup(props: any) { const { size, fillColor, iconName: _iconName } = toRefs(props) const iconName = `#${_iconName.value}` return { size, fillColor, iconName } } } </script>
然後,新建一個icons目錄,並且新建一個index文件,用來掛在組件和引入svg圖標:
// index.ts import SvgIcon from '@/components/SvgIcon.vue' import { App } from 'vue' export default (app: App) => { app.component('svg-icon', SvgIcon) } const ctx = require.context('./svg', false, /\.svg$/) const requestAll = (ctx: __WebpackModuleApi.RequireContext) => ctx.keys().forEach(ctx) requestAll(ctx)
// main.ts import { createApp } from 'vue' import App from './App.vue' import installSvgIcon from '@/icons/index' const app = createApp(App) installSvgIcon(app) app.mount('#app')
這個文件做瞭兩件事:
- 通過導出一個方法來掛載全局組件svg-icon;
- 通過require.context來實現自動化引入svg目錄下的圖標文件。
使用組件
首先,我們要在icons/svg目錄下存放svg圖標文件(在iconfont上找自己需要的);
然後,就可以在其他地方使用啦:
<template> <img alt="Vue logo" src="./assets/logo.png"> <svg-icon icon-name="icon-dashboard"></svg-icon> <HelloWorld msg="Welcome to Your Vue.js + TypeScript App"/> </template>
直接通過組件svg-icon的方式引入,然後傳入icon-name即可,icon-name的值由icon拼接svg文件名組成。
總結
這種自定義方式引入svg圖標的方式,還是挺方便的,想要加上一個圖標的時候,幾步即可:
- 直接下載好svg文件放入對應目錄中;
- 接著通過svg-icon組件來引入。
但是,修改樣式時不能通過css來修改,這點就不太方便瞭。
到此這篇基於Vue實現自定義組件的方式引入圖標的文章就介紹到這瞭,更多相關Vue自定義的圖標組件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- svgicon組件使用方法示例詳解
- vue3+vue-cli4中使用svg的方式詳解(親測可用)
- Vue中引入svg圖標的兩種方式
- vue如何封裝自己的Svg圖標組件庫(svg-sprite-loader)
- React優雅的封裝SvgIcon組件示例