国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Vue.js 圖標選擇組件實踐詳解

2019-11-19 12:25:16
字體:
供稿:網(wǎng)友

本文介紹了Vue.js 圖標選擇組件實踐詳解,分享給大家,具體如下:

背景

最近項目中在做一個自定義菜單需求,其中有一個為菜單設(shè)置小圖標的功能,就是大家常見的左側(cè)菜單

設(shè)置圖標不難,方案就是字體圖標,可供使用的圖標庫也有很多,比如阿里巴巴的 Iconfont,以及 Fontaswsome 等,問題在于如何優(yōu)雅的提供幾百個圖標供用戶選擇,而不需要開發(fā)去一個一個的寫標簽,也不需要一個個的去找圖標。

字體圖標庫 Fontawesome 方案

我們使用字體圖標的方式,一般是一個 <i class="iconfont icon-home"></i>  這樣的標簽,平常開發(fā)中用一些圖標都是用到一個寫一個,展示10個圖標,就要寫10個標簽。

在項目中本人使用的是 Fontawesome 圖標庫方案,使用它是因為提供的可用圖標比較豐富,基本上不需要特意去找合適的圖標,直接把它的圖標庫下載過來,免費的有800多個。

這么多圖標難道要一個一個手寫800多個 i 標簽嗎?三連拒絕!

Fontawesome 下載后的文件中提供一個 svg格式的精靈圖,這個非常人性化,用 VSCode 打開這個SVG文件

可以看到是熟悉的DOM,因為SVG本質(zhì)上就是一個XML,既然是DOM,那么祭出JS大法吧,用瀏覽器打開這個SVG文件,在控制臺編寫如下代碼獲取所有的圖標名稱:

const nodeArray = Array.from(document.querySelectorAll('symbol'));const names = nodeArray.map(item => item.id)names.toString()

Icons組件

大牛可以忽略

拿到了所有圖標的 name 那就好辦了,一個數(shù)組循環(huán)唄。先別急著寫代碼,我們的目的是封裝成組件復(fù)用,那么先創(chuàng)建一個 Icons 組件

提供一個篩選框,然后給一個事件即可

<template> <div class="ui-fas">  <el-input v-model="name" @input.native="filterIcons" suffix-icon="el-icon-search" placeholder="請輸入圖標名稱"></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>

先把拿到的所有圖標name放到一個 solid.js 文件中,輸出為數(shù)組,在組件中引入,然后就是循環(huán)數(shù)組 iconList,輸出i標簽,F(xiàn)ontawesome 的使用方式是:<i></i>

篩選功能利用數(shù)組的 filter 方法,this.$emit('selected', name) 方式返回給父組件圖標名稱。

以上樣式都是利用Element UI 的 Popover、Input 組件實現(xiàn)

<el-form-item label="圖標:" > <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="請輸入內(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>

組件實現(xiàn)了,接下來就是引用,既可以直接到導(dǎo)入此組件引用,也可以掛載到全局進行使用,這里說說掛載到全局使用的方式,因為我的項目中所有的公共組件都是掛載到全局的方式使用。

在組件平級新建一個 index.js 文件

import IconsCompontent from './Icons.vue'const Icons = { install(Vue) {  Vue.component('ui-icons', IconsCompontent); }}export default Icons;

第4行為組件命名,此名稱決定了如何使用組件,這里是ui-icons,那么使用的時候就是:

<ui-icons />

接著在項目 components 根目錄新建 index.js,這里是所有組件的集合

最后一步是在 main.js 中注冊:

import CustomComponents from './components/index.js'Object.keys(CustomComponents).forEach(key => Vue.use(CustomComponents[key]))

這樣就可以在項目中任意.vue文件中以<ui-icons />方式使用組件了。

后記

點擊圖標后要不要關(guān)閉圖標彈出層(Popover)呢?Popover 是需要鼠標點擊其他地方才會隱藏的,選擇一個圖標后就關(guān)閉 Popover 呢,我的做法是:document.body.click()

selectedIcon (name) { this.form.menu_icon = name // document.body.click()}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 安阳县| 德保县| 崇州市| 通江县| 福贡县| 屯昌县| 青海省| 淄博市| 盖州市| 阜阳市| 周口市| 蒙自县| 波密县| 仪陇县| 翁牛特旗| 大理市| 安达市| 满城县| 蓝田县| 台安县| 刚察县| 铜陵市| 英吉沙县| 江川县| 庆安县| 兴化市| 北海市| 清徐县| 北票市| 大庆市| 舒城县| 乌拉特前旗| 车致| 锦州市| 宁陕县| 冀州市| 云梦县| 介休市| 苏尼特左旗| 咸丰县| 梅州市|