基于Vue實(shí)現(xiàn)自定義組件的方式引入圖標(biāo)
前言
在項(xiàng)目開發(fā)中,使用圖標(biāo)的方式有很多種,可以在iconfont上面找到合適的圖標(biāo),通過http或者直接下載使用,這里我分享一種通過實(shí)現(xiàn)自定義組件的方式引入圖標(biāo)。
搭建環(huán)境
這里通過@vue/cli 4.5.13新建項(xiàng)目,并且需要安裝依賴svg-sprite-loader,用來處理對(duì)應(yīng)的svg圖標(biāo),方便我們使用。
安裝: 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來做了兩項(xiàng)配置:
- 第一個(gè)是讓原來的其他處理svg的依賴不處理src/icons下我們的自定義圖標(biāo)文件
- 通過svg-sprite-loader來處理自定義的圖標(biāo)文件,options里面的設(shè)置表示,生成的svg的symbolId為icon和文件名的拼接。
新建圖標(biāo)組件
在components目錄下新建一個(gè)SvgIcon.vue文件:
<template>
<i class="icon">
<!-- aria-hidden, 幫助殘障人士閱讀(設(shè)備讀取內(nèi)容時(shí)會(huì)跳過這個(gè)標(biāo)簽以免混淆) -->
<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>
然后,新建一個(gè)icons目錄,并且新建一個(gè)index文件,用來掛在組件和引入svg圖標(biāo):
// 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')
這個(gè)文件做了兩件事:
- 通過導(dǎo)出一個(gè)方法來掛載全局組件svg-icon;
- 通過require.context來實(shí)現(xiàn)自動(dòng)化引入svg目錄下的圖標(biāo)文件。
使用組件
首先,我們要在icons/svg目錄下存放svg圖標(biāo)文件(在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文件名組成。
總結(jié)
這種自定義方式引入svg圖標(biāo)的方式,還是挺方便的,想要加上一個(gè)圖標(biāo)的時(shí)候,幾步即可:
- 直接下載好svg文件放入對(duì)應(yīng)目錄中;
- 接著通過svg-icon組件來引入。
但是,修改樣式時(shí)不能通過css來修改,這點(diǎn)就不太方便了。
到此這篇基于Vue實(shí)現(xiàn)自定義組件的方式引入圖標(biāo)的文章就介紹到這了,更多相關(guān)Vue自定義的圖標(biāo)組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Element?Plus組件Form表單Table表格二次封裝的完整過程
一般在后臺(tái)管理系統(tǒng)的開發(fā)中,都會(huì)遇到很多table,但每一次都去引入el-table就會(huì)導(dǎo)致代碼十分冗余,所以基于組件做一下二次封裝成自己需要的組件就十分nice,下面這篇文章主要給大家介紹了關(guān)于Element?Plus組件Form表單Table表格二次封裝的相關(guān)資料,需要的朋友可以參考下2022-09-09
Vue異步更新機(jī)制及$nextTick原理的深入講解
最近在學(xué)習(xí)一些底層方面的知識(shí),所以想做個(gè)系列嘗試去聊聊這些比較復(fù)雜又很重要的知識(shí)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于Vue異步更新機(jī)制及$nextTick原理的相關(guān)資料,需要的朋友可以參考下2022-04-04
解決找不到模塊“xxx.vue”或其相應(yīng)的類型聲明問題
這篇文章主要介紹了解決找不到模塊“xxx.vue”或其相應(yīng)的類型聲明問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-10-10
elementUI多選框反選的實(shí)現(xiàn)代碼
這篇文章主要介紹了elementUI多選框反選的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
vue實(shí)現(xiàn)登錄后頁面跳轉(zhuǎn)到之前頁面
本文給大家分享了vue實(shí)現(xiàn)登錄后頁面跳轉(zhuǎn)到之前頁面的一個(gè)功能,有這方便需要的朋友學(xué)習(xí)參考下吧。2018-01-01
詳解Element-ui NavMenu子菜單使用遞歸生成時(shí)使用報(bào)錯(cuò)
這篇文章主要介紹了詳解Element-ui NavMenu子菜單使用遞歸生成時(shí)使用報(bào)錯(cuò),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

