Vue.js 图标选择组件实践详解


Posted in Javascript onDecember 03, 2018

本文介绍了Vue.js 图标选择组件实践详解,分享给大家,具体如下:

Vue.js 图标选择组件实践详解

背景

最近项目中在做一个自定义菜单需求,其中有一个为菜单设置小图标的功能,就是大家常见的左侧菜单

Vue.js 图标选择组件实践详解

设置图标不难,方案就是字体图标,可供使用的图标库也有很多,比如阿里巴巴的 Iconfont,以及 Fontaswsome 等,问题在于如何优雅的提供几百个图标供用户选择,而不需要开发去一个一个的写标签,也不需要一个个的去找图标。

字体图标库 Fontawesome 方案

我们使用字体图标的方式,一般是一个 <i class="iconfont icon-home"></i>  这样的标签,平常开发中用一些图标都是用到一个写一个,展示10个图标,就要写10个标签。

在项目中本人使用的是 Fontawesome 图标库方案,使用它是因为提供的可用图标比较丰富,基本上不需要特意去找合适的图标,直接把它的图标库下载过来,免费的有800多个。

Vue.js 图标选择组件实践详解

这么多图标难道要一个一个手写800多个 i 标签吗?三连拒绝!

Fontawesome 下载后的文件中提供一个 svg格式的精灵图,这个非常人性化,用 VSCode 打开这个SVG文件

Vue.js 图标选择组件实践详解

可以看到是熟悉的DOM,因为SVG本质上就是一个XML,既然是DOM,那么祭出JS大法吧,用浏览器打开这个SVG文件,在控制台编写如下代码获取所有的图标名称:

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

Vue.js 图标选择组件实践详解

Icons组件

大牛可以忽略

拿到了所有图标的 name 那就好办了,一个数组循环呗。先别急着写代码,我们的目的是封装成组件复用,那么先创建一个 Icons 组件

Vue.js 图标选择组件实践详解

提供一个筛选框,然后给一个事件即可

<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 文件

Vue.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,这里是所有组件的集合

Vue.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()
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
seajs1.3.0源码解析之module依赖有序加载
Nov 07 Javascript
简单的JavaScript互斥锁分享
Feb 02 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
Mar 28 Javascript
javascript自定义in_array()函数实现方法
Aug 03 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
Sep 17 Javascript
浅析JS原型继承与类的继承
Apr 07 Javascript
非常漂亮的相册集 使用jquery制作相册集
Apr 28 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
May 05 Javascript
Vue.js常用指令的使用小结
Jun 23 Javascript
js禁止浏览器页面后退功能的实例(推荐)
Sep 01 Javascript
laydate只显示时分 不显示秒的功能实现方法
Sep 28 Javascript
js校验开始时间和结束时间
May 26 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
Dec 03 #Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
Dec 03 #Javascript
利用jquery和BootStrap实现动态滚动条效果
Dec 03 #jQuery
微信小程序实现页面下拉刷新和上拉加载功能详解
Dec 03 #Javascript
微信小程序在地图选择地址并返回经纬度简单示例
Dec 03 #Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
Dec 03 #Javascript
创建Vue项目以及引入Iview的方法示例
Dec 03 #Javascript
You might like
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
js 模拟气泡屏保效果代码
2010/07/10 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
AngularJS手动表单验证
2016/02/01 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
self.attachevent is not a function的解决方法
2017/04/04 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
Vue中render函数的使用方法
2018/01/31 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
python实现识别相似图片小结
2016/02/22 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
python如何保证输入键入数字的方法
2019/08/23 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
英文自我鉴定
2013/12/10 职场文书
专业求职信撰写要诀
2014/02/18 职场文书
怎样填写就业意向
2014/04/02 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript