Vue.js 圖標(biāo)選擇組件實(shí)踐詳解
本文介紹了Vue.js 圖標(biāo)選擇組件實(shí)踐詳解,分享給大家,具體如下:
背景
最近項(xiàng)目中在做一個(gè)自定義菜單需求,其中有一個(gè)為菜單設(shè)置小圖標(biāo)的功能,就是大家常見的左側(cè)菜單
設(shè)置圖標(biāo)不難,方案就是字體圖標(biāo),可供使用的圖標(biāo)庫(kù)也有很多,比如阿里巴巴的 Iconfont,以及 Fontaswsome 等,問題在于如何優(yōu)雅的提供幾百個(gè)圖標(biāo)供用戶選擇,而不需要開發(fā)去一個(gè)一個(gè)的寫標(biāo)簽,也不需要一個(gè)個(gè)的去找圖標(biāo)。
字體圖標(biāo)庫(kù) Fontawesome 方案
我們使用字體圖標(biāo)的方式,一般是一個(gè) <i class="iconfont icon-home"></i>
這樣的標(biāo)簽,平常開發(fā)中用一些圖標(biāo)都是用到一個(gè)寫一個(gè),展示10個(gè)圖標(biāo),就要寫10個(gè)標(biāo)簽。
在項(xiàng)目中本人使用的是 Fontawesome 圖標(biāo)庫(kù)方案,使用它是因?yàn)樘峁┑目捎脠D標(biāo)比較豐富,基本上不需要特意去找合適的圖標(biāo),直接把它的圖標(biāo)庫(kù)下載過來,免費(fèi)的有800多個(gè)。
這么多圖標(biāo)難道要一個(gè)一個(gè)手寫800多個(gè) i
標(biāo)簽嗎?三連拒絕!
Fontawesome 下載后的文件中提供一個(gè) svg格式的精靈圖,這個(gè)非常人性化,用 VSCode 打開這個(gè)SVG文件
可以看到是熟悉的DOM,因?yàn)镾VG本質(zhì)上就是一個(gè)XML,既然是DOM,那么祭出JS大法吧,用瀏覽器打開這個(gè)SVG文件,在控制臺(tái)編寫如下代碼獲取所有的圖標(biāo)名稱:
const nodeArray = Array.from(document.querySelectorAll('symbol')); const names = nodeArray.map(item => item.id) names.toString()
Icons組件
大牛可以忽略
拿到了所有圖標(biāo)的 name 那就好辦了,一個(gè)數(shù)組循環(huán)唄。先別急著寫代碼,我們的目的是封裝成組件復(fù)用,那么先創(chuàng)建一個(gè) Icons 組件
提供一個(gè)篩選框,然后給一個(gè)事件即可
<template> <div class="ui-fas"> <el-input v-model="name" @input.native="filterIcons" suffix-icon="el-icon-search" placeholder="請(qǐng)輸入圖標(biāo)名稱"></el-input> <ul class="fas-icon-list"> <li v-for="(item, index) in iconList" :key="index" @click="selectedIcon(item)"> <i class="fas" :class="['fa-' + item]" /> <span>{{item}}</span> </li> </ul> </div> </template> <script> import fontawesome from '@/extend/fontawesome/solid.js' export default { name: 'compIcons', data () { return { name: '', iconList: fontawesome } }, methods: { filterIcons () { if (this.name) { this.iconList = this.iconList.filter(item => item.includes(this.name)) } else { this.iconList = fontawesome } }, selectedIcon (name) { this.$emit('selected', name) }, reset () { this.name = '' this.iconList = fontawesome } } } </script>
先把拿到的所有圖標(biāo)name放到一個(gè) solid.js 文件中,輸出為數(shù)組,在組件中引入,然后就是循環(huán)數(shù)組 iconList
,輸出i
標(biāo)簽,F(xiàn)ontawesome 的使用方式是:<i></i>
。
篩選功能利用數(shù)組的 filter 方法,this.$emit('selected', name)
方式返回給父組件圖標(biāo)名稱。
以上樣式都是利用Element UI 的 Popover、Input 組件實(shí)現(xiàn)
<el-form-item label="圖標(biāo):" > <el-popover placement="left-start" width="540" trigger="click" @show="$refs.icons.reset()" popper-class="popper-class"> <ui-icons ref="icons" @selected="selectedIcon" /> <el-input slot="reference" placeholder="請(qǐng)輸入內(nèi)容" readonly v-model="form.menu_icon" style="cursor: pointer;"> <template slot="prepend"><i class="fas" :class="['fa-' + form.menu_icon]"></i></template> </el-input> </el-popover> </el-form-item>
組件實(shí)現(xiàn)了,接下來就是引用,既可以直接到導(dǎo)入此組件引用,也可以掛載到全局進(jìn)行使用,這里說說掛載到全局使用的方式,因?yàn)槲业捻?xiàng)目中所有的公共組件都是掛載到全局的方式使用。
在組件平級(jí)新建一個(gè) index.js 文件
import IconsCompontent from './Icons.vue' const Icons = { install(Vue) { Vue.component('ui-icons', IconsCompontent); } } export default Icons;
第4行為組件命名,此名稱決定了如何使用組件,這里是ui-icons
,那么使用的時(shí)候就是:
<ui-icons />
接著在項(xiàng)目 components 根目錄新建 index.js,這里是所有組件的集合
最后一步是在 main.js 中注冊(cè):
import CustomComponents from './components/index.js' Object.keys(CustomComponents).forEach(key => Vue.use(CustomComponents[key]))
這樣就可以在項(xiàng)目中任意.vue
文件中以<ui-icons />
方式使用組件了。
后記
點(diǎn)擊圖標(biāo)后要不要關(guān)閉圖標(biāo)彈出層(Popover)呢?Popover 是需要鼠標(biāo)點(diǎn)擊其他地方才會(huì)隱藏的,選擇一個(gè)圖標(biāo)后就關(guān)閉 Popover 呢,我的做法是:document.body.click()
。
selectedIcon (name) { this.form.menu_icon = name // document.body.click() }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 在 Vue 中編寫 SVG 圖標(biāo)組件的方法
- vue 組件簡(jiǎn)介
- vue+vuex+axios從后臺(tái)獲取數(shù)據(jù)存入vuex,組件之間共享數(shù)據(jù)操作
- Vue 解決通過this.$refs來獲取DOM或者組件報(bào)錯(cuò)問題
- vue 組件之間事件觸發(fā)($emit)與event Bus($on)的用法說明
- vue內(nèi)置組件component--通過is屬性動(dòng)態(tài)渲染組件操作
- Vue組件跨層級(jí)獲取組件操作
- vue之父子組件間通信實(shí)例講解(props、$ref、$emit)
- vue如何引用其他組件(css和js)
- vue mounted組件的使用
- vue組件 $children,$refs,$parent的使用詳解
- Vue-Router實(shí)現(xiàn)組件間跳轉(zhuǎn)的三種方法
- 如何在Vue.JS中使用圖標(biāo)組件
相關(guān)文章
vue項(xiàng)目啟動(dòng)如何設(shè)置默認(rèn)啟動(dòng)頁
這篇文章主要介紹了vue項(xiàng)目啟動(dòng)如何設(shè)置默認(rèn)啟動(dòng)頁問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06vue+echarts實(shí)現(xiàn)動(dòng)態(tài)繪制圖表及異步加載數(shù)據(jù)的方法
vue寫的后臺(tái)管理,需要將表格數(shù)據(jù)繪制成圖表(折線圖,柱狀圖),圖表數(shù)據(jù)都是通過接口請(qǐng)求回來的。這篇文章主要介紹了vue+echarts 動(dòng)態(tài)繪制圖表及異步加載數(shù)據(jù)的相關(guān)知識(shí),需要的朋友可以參考下2018-10-10unplugin-svg-component優(yōu)雅使用svg圖標(biāo)指南
這篇文章主要為大家介紹了unplugin-svg-component優(yōu)雅使用svg圖標(biāo)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03el-input寬度跟隨輸入內(nèi)容自適應(yīng)的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于el-input寬度跟隨輸入內(nèi)容自適應(yīng)的實(shí)現(xiàn)方法,我們?cè)賹?shí)際應(yīng)用中可能需要input文本框能夠根據(jù)輸入字符的所占據(jù)的寬度自動(dòng)調(diào)節(jié)尺寸,需要的朋友可以參考下2023-08-08vue項(xiàng)目設(shè)置活性字體過程(自適應(yīng)字體大小)
這篇文章主要介紹了vue項(xiàng)目設(shè)置活性字體過程(自適應(yīng)字體大小),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09vue中實(shí)現(xiàn)移動(dòng)端的scroll滾動(dòng)方法
下面小編就為大家分享一篇vue中實(shí)現(xiàn)移動(dòng)端的scroll滾動(dòng)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03