亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 12:25:16
字體:
來源:轉載
供稿:網友

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

背景

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

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

字體圖標庫 Fontawesome 方案

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

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

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

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

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

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

Icons組件

大??梢院雎?/blockquote>

拿到了所有圖標的 name 那就好辦了,一個數組循環唄。先別急著寫代碼,我們的目的是封裝成組件復用,那么先創建一個 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 文件中,輸出為數組,在組件中引入,然后就是循環數組 iconList,輸出i標簽,Fontawesome 的使用方式是:<i></i>。

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

以上樣式都是利用Element UI 的 Popover、Input 組件實現

<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="請輸入內容" 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>

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

在組件平級新建一個 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 />方式使用組件了。

后記

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人在线播放av| 日本在线观看天堂男亚洲| 欧美精品videossex性护士| 国产日韩在线视频| 国产999精品久久久| 成人黄色午夜影院| 亚洲精品国产综合区久久久久久久| 91社影院在线观看| 国产精品久久激情| 国产在线观看精品| 97国产精品视频人人做人人爱| 亚洲精美色品网站| 成人免费看吃奶视频网站| 热久久视久久精品18亚洲精品| 欧美精品日韩三级| 日韩一区二区三区在线播放| 韩剧1988免费观看全集| 黄色精品一区二区| 久久久亚洲福利精品午夜| 97在线免费观看| 91亚洲午夜在线| 国产精品高潮呻吟久久av无限| 欧美高清视频免费观看| 欧美在线亚洲一区| 国产在线精品自拍| 大荫蒂欧美视频另类xxxx| 欧美一区在线直播| 91久久在线视频| 国内揄拍国内精品| 欧美高清视频一区二区| 91tv亚洲精品香蕉国产一区7ujn| 97国产在线观看| 伊人久久男人天堂| 国产精品一区二区三区久久| 欧美理论电影网| 欧美疯狂做受xxxx高潮| 色综合久久88| 国产视频欧美视频| 欧洲午夜精品久久久| 亚洲精品自拍偷拍| 国产精品丝袜久久久久久高清| 正在播放亚洲1区| 欧美亚洲另类制服自拍| 亚洲一区二区久久久久久| 黑人巨大精品欧美一区二区免费| 色妞在线综合亚洲欧美| 国产精品18久久久久久麻辣| 91福利视频在线观看| 日韩网站免费观看| 2019中文字幕全在线观看| 亚洲乱亚洲乱妇无码| 欧洲精品在线视频| 成人免费大片黄在线播放| 最近2019年中文视频免费在线观看| 性色av一区二区三区| 综合国产在线视频| 97久久伊人激情网| 国产精品视频男人的天堂| 国产精品永久免费视频| 成人久久精品视频| 亚洲自拍中文字幕| 美女国内精品自产拍在线播放| 国产精品丝袜久久久久久不卡| 亚洲视频自拍偷拍| 国产综合在线视频| 5566日本婷婷色中文字幕97| 久久成人免费视频| 亚洲乱码av中文一区二区| 日韩福利视频在线观看| 欧美一级大片视频| 国产精品高清在线观看| 亚洲精品乱码久久久久久金桔影视| 亚洲精品乱码久久久久久按摩观| 欧美一区二区三区四区在线| 91免费欧美精品| 亚洲图片欧美午夜| 亚洲欧美国产日韩中文字幕| 日韩高清人体午夜| 在线观看国产精品日韩av| 亚洲国产小视频在线观看| 九九综合九九综合| 欧美专区在线观看| 国产成人精品在线观看| 国产精品爽爽爽爽爽爽在线观看| 2019精品视频| 久久九九全国免费精品观看| 国产精品a久久久久久| 亚洲欧美国产精品专区久久| 成人自拍性视频| 亚洲精品国产精品久久清纯直播| 欧美精品福利在线| 2019中文在线观看| 国产精品999| 欧美精品videosex牲欧美| 国产91亚洲精品| 成人黄在线观看| 亚洲成年网站在线观看| 中文字幕久热精品在线视频| 精品夜色国产国偷在线| 亚洲日韩欧美视频| 亚洲精品自拍第一页| 亚洲国产高清自拍| 欧洲成人在线观看| 国产精品入口福利| 久久精品精品电影网| 欧美裸身视频免费观看| 国产精品免费在线免费| 亚洲精品成人免费| 日韩亚洲国产中文字幕| 欧美性猛交丰臀xxxxx网站| 91高清视频免费| 色综合久久88色综合天天看泰| 国产精品一香蕉国产线看观看| 色无极亚洲影院| 欧美精品久久久久a| 亚洲无限av看| 精品国产91乱高清在线观看| 欧美日韩高清在线观看| 国产精品久久不能| 亚洲欧美精品中文字幕在线| 91精品国产99久久久久久| 欧美国产第一页| 欧美激情国产精品| 国产脚交av在线一区二区| 国产va免费精品高清在线| 久久伊人91精品综合网站| 国产精品爽黄69天堂a| 亚洲韩国欧洲国产日产av| 亚洲成人精品久久久| 亚洲国产精品va在线看黑人动漫| 美女性感视频久久久| 欧美另类在线观看| 国产成人拍精品视频午夜网站| 中文字幕亚洲精品| 欧美激情中文字幕在线| 亚洲欧洲高清在线| 黑人极品videos精品欧美裸| 久久影视免费观看| 97激碰免费视频| 欧美亚洲国产视频| 欧美高清自拍一区| 欧美日韩黄色大片| 亚洲第一免费网站| 欧美高清videos高潮hd| 国产ts人妖一区二区三区| 国产精品成人一区| 日韩av不卡在线| 91爱视频在线| 亚洲美女www午夜| 久久久电影免费观看完整版| 国产精品久久久久久久午夜| 日韩欧美亚洲一二三区| 在线播放国产一区二区三区| 欧美性视频网站| 国产精品一区二区三区久久久| 国产精品18久久久久久麻辣| 欧美大片免费看| 福利二区91精品bt7086| 亚洲国产精品专区久久| 亚洲最大激情中文字幕| 亚洲最新中文字幕| 美女久久久久久久久久久| 国a精品视频大全| 国产97人人超碰caoprom|