在VUE+Element 前端应用中,图标是必不可少点缀界面的元素,所以整合一些经常使用的图标是很是必要的,还好Element界面组件里面提供了不少常见的图标,不过数量不是不少,应该是300个左右吧,所以考虑扩展更多图标,我引入了vue-awesome组件,它利用了Font Awesome的内置图标,实现了更多图标的整合,能够在项目中使用更多的图标元素了,另外在本随笔的图标管理中,提供了对图标名称进行搜索,并根据图标颜色样式生成对应图标的代码,很是方便使用。html
Vue-Awesome 是基于 Vue.js 的 SVG 图标组件,内置图标来自 Font Awesome。前端
本篇随笔先来上一个图标管理的界面效果,而后在逐一进行介绍Element内置图标和Vue-Awesome的图标吧。vue
Element图标管理界面以下:html5
基于Vue-Awesome的图标管理以下所示。node
其中查询提供了名称进行图标查询,以及限制一次性展现多少个,另外提供一个自定义颜色选项,从而能够改变图标的展现颜色。webpack
Vue-Awesome 的 npm的安装命令以下所示:git
npm install vue-awesome
安装方式以下所示github
import Vue from 'vue' /* 在下面两种方式中任选一种 */ // 仅引入用到的图标以减少打包体积 import 'vue-awesome/icons/flag' // 或者在不关心打包体积时一次引入所有图标 import 'vue-awesome/icons' /* 任选一种注册组件的方式 */ import Icon from 'vue-awesome/components/Icon' // 全局注册(在 `main .js` 文件中) Vue.component('v-icon', Icon) // 或局部注册(在组件文件中) export default { components: { 'v-icon': Icon } }
界面使用代码以下所示,详细Demo能够参考https://justineo.github.io/vue-awesome/demo/ 了解。web
<!-- 基础用法 --> <v-icon name="beer"/> <!-- 添加选项 --> <v-icon name="sync" scale="2" spin/> <v-icon name="comment" flip="horizontal"/> <v-icon name="code-branch" label="Forked Repository"/> <!-- 堆叠图标 --> <v-icon label="No Photos"> <v-icon name="camera"/> <v-icon name="ban" scale="2" class="alert"/> </v-icon>
Vue-Awesome图标提供了一些prop的属性设置,参考下面列表所示。npm
name: string
图标名称。若是本组件没有用做图标堆栈的容器,那么这个字段是必须的。全部合法的值都对应于图标文件相对于 icons
目录的路径。请注意当你在 FontAwesome 官网查找到图标名词后,须要确认一下图标集的名称。好比,在 500px
这个图标的详情页会有一个 URL 参数 style=brands
,故图标名称就是 brands/500px
。
默认状况下,只能使用 FontAwesome 的免费图标,另外因为 solid
样式中的图标最多,咱们将其设为了默认图标集,因此路径前缀能够省略。
当传入 null
时,整个组件将不会渲染。
scale: number|string
用来调整图标尺寸,默认值为 1
。
spin: boolean
用来指定图标是否须要旋转。默认值为 false
。(不能与 pulse
一同使用。)
pulse: boolean
用来指定图标是否有脉冲旋转的效果。默认值为 false
。(不能与 spin
一同使用。)
inverse: boolean
为 true
时图标颜色将被设置为 #fff
。默认值为 false
。
flip: 'vertical'|'horizontal'|'both'
用来指定图标是否须要翻转。
label: string
当指定时会设置图标的 aria-label
。
title: string
为图标设置标题。
另外,咱们也能够注册自定义图标,以下所示。
import Icon from 'vue-awesome/components/Icon' Icon.register({ baidu: { width: 23.868, height: 26, d: 'M3.613 13.701c2.827-.608 2.442-3.986 2.357-4.725-.138-1.139-1.477-3.128-3.296-2.971C.386 6.21.052 9.515.052 9.515c-.309 1.528.74 4.793 3.561 4.186zm3.002 5.875c-.083.238-.268.846-.107 1.375.315 1.187 1.346 1.24 1.346 1.24h1.48v-3.619H7.749c-.713.213-1.057.767-1.134 1.004zM8.86 8.035c1.562 0 2.823-1.797 2.823-4.019C11.683 1.796 10.421 0 8.86 0 7.301 0 6.036 1.796 6.036 4.016c0 2.222 1.265 4.019 2.824 4.019zm6.724.265c2.087.271 3.429-1.956 3.695-3.644.272-1.686-1.074-3.644-2.552-3.98-1.48-.339-3.329 2.032-3.497 3.578-.2 1.89.271 3.778 2.354 4.046zm5.114 9.923s-3.229-2.498-5.113-5.198c-2.555-3.981-6.185-2.361-7.399-.337-1.209 2.024-3.093 3.305-3.36 3.644-.271.334-3.9 2.293-3.095 5.871.806 3.576 3.635 3.508 3.635 3.508s2.085.205 4.504-.336c2.42-.537 4.503.134 4.503.134s5.652 1.893 7.199-1.751c1.545-3.645-.874-5.535-.874-5.535zm-9.671 5.423H7.352c-1.587-.316-2.219-1.4-2.299-1.584-.078-.188-.528-1.059-.29-2.539.686-2.219 2.642-2.379 2.642-2.379h1.956V14.74l1.666.025v8.881zm6.844-.025h-4.229c-1.639-.423-1.716-1.587-1.716-1.587v-4.677l1.716-.027v4.203c.104.447.661.529.661.529h1.742v-4.705h1.825v6.264zm5.986-12.486c0-.808-.671-3.239-3.159-3.239-2.492 0-2.825 2.295-2.825 3.917 0 1.548.131 3.71 3.227 3.641 3.096-.068 2.757-3.507 2.757-4.319z' } })
若是你的 SVG 文件有多个路径或多边形,以及/或者你想预约义一些样式,能够用以下方式进行注册:
路径方式:
import Icon from 'vue-awesome/components/Icon' Icon.register({ webpack: { width: 1200, height: 1200, paths: [ { style: 'fill:#8ED6FB', d: 'M1035.6 879.3l-418.1 236.5V931.6L878 788.3l157.6 91zm28.6-25.9V358.8l-153 88.3V765l153 88.4zm-901.5 25.9l418.1 236.5V931.6L320.3 788.3l-157.6 91zm-28.6-25.9V358.8l153 88.3V765l-153 88.4zM152 326.8L580.8 84.2v178.1L306.1 413.4l-2.1 1.2-152-87.8zm894.3 0L617.5 84.2v178.1l274.7 151.1 2.1 1.2 152-87.8z' }, { style: 'fill:#1C78C0', d: 'M580.8 889.7l-257-141.3v-280l257 148.4v272.9zm36.7 0l257-141.3v-280l-257 148.4v272.9zm-18.3-283.6zM341.2 436l258-141.9 258 141.9-258 149-258-149z' } ] } })
多边形方式:
import Icon from 'vue-awesome/components/Icon' Icon.register({ vue: { width: 256, height: 221, polygons: [ { style: 'fill:#41B883', points: '0,0 128,220.8 256,0 204.8,0 128,132.48 50.56,0 0,0' }, { style: 'fill:#35495E', points: '50.56,0 128,133.12 204.8,0 157.44,0 128,51.2 97.92,0 50.56,0' } ] } })
对于自定义的这些图标,咱们能够把它们一块儿放在一个独立的JS文件里面进行定义,而后全局统一加入便可。
使用上和其余的图标没有差别,只是名称不一样而已。
<div style="height:100px;padding:10px"> <span>vue-Awesome 自定义图标:(在utils/awesome-icon-customed.js中引入)</span> <v-icon name="baidu" scale="2" :style="iconStyle" /> <v-icon name="vue" scale="2" /> <v-icon name="webpack" scale="2" spin /> <v-icon name="html5-c" scale="2" spin /> </div>
在咱们进行页面管理的时候,咱们须要提取Element 图标和Vue-Awesome图标,以便可以进行界面的展现处理。
Element图标,咱们只须要在一个JS文件里面,包含它的名称进去一个列表里面便可,以下定义所示。
const elementIcons = [ 'platform-eleme', 'eleme', 'delete-solid', 'delete', .......... ] export default elementIcons
在其中录入对应Element的图表名称,移除el-icon-的前缀便可构成所需列表的每项内容。
而对于Vue-Awesome图标,咱们安装对应的组件后,它的图标资源确定也必定下载下来了,咱们找到对应的node_modules 目录下的文件就能够看到了,以下截图所示。
能够看到它的每一个图标对应一个js文件,并且不一样样式还有不一样的目录的,咱们只须要自动加入对应的文件名称便可。
定义一个js文件,如vue-awesome-icon.js,用来获取对应Awesome图标名称,以下逻辑所示
// Vue-Awesome图标自动加入 const req = require.context('vue-awesome/icons', true, /\.js$/) const requireAll = requireContext => requireContext.keys() const re = /\.\/(.*)\.js/ const vueAwesomeIcons = requireAll(req).filter((key) => { return key.indexOf('index.js') < 0 }).map(i => { return i.match(re)[1] }) export default vueAwesomeIcons
经过 require.context 的操做以及仅需filter的数组过滤,咱们就能够得到对应的Awesome图标名称了。
在管理页面里面,咱们须要引入Element和Vue-Awesome的图标管理文件,以下所示。
import elementIcons from './element-icons' // 引入Element图标 import vueAwesomeIcons from './vue-awesome-icons' // 引入vue-awesome图标
而后构造页面的data数据,以下所示,其中searchForm 是用来承载查询条件的。
export default { name: 'Icons', data() { return { // 查询表单 searchForm: { label: '', pagesize: 50, color: '#409EFF' }, // 自定义svg图标集合 svgIcons, // element图标集合 elementIcons, // vueAwesome图标集合 vueAwesomeIcons } },
而后增长几个Computed函数,用来处理数据的过滤查询等操做。
computed: { iconStyle: function() { return { color: this.searchForm.color } }, elementIconsFiltered: function() { const that = this var list = that.elementIcons.filter(item => { return item.indexOf(that.searchForm.label) >= 0 }) if (that.searchForm.pagesize > 0) { return list.slice(0, that.searchForm.pagesize) } else { return list } }, vueAwesomeIconsFiltered: function() { const that = this var list = that.vueAwesomeIcons.filter(item => { return item.indexOf(that.searchForm.label) >= 0 }) if (that.searchForm.pagesize > 0) { return list.slice(0, that.searchForm.pagesize) } else { return list } } },
而后在method里面,对常规的图标进行生成处理便可。
methods: { generateElementIconCode(symbol) { return `<i class="el-icon-${symbol}" style="color:${this.searchForm.color};"/>` }, generateAwesomeIconCode(symbol) { return `<v-icon name="${symbol}" style="color:${this.searchForm.color};"/>` }, handleClipboard(text, event) { if (text) { clipboard(text, event) } } }
对于界面的展现,咱们以Vue-awesome图标展现为例介绍,以下所示。
<el-tab-pane label="Vue-Awesome 图标"> <div v-for="item of vueAwesomeIconsFiltered" :key="item" @click="handleClipboard(generateAwesomeIconCode(item),$event)" > <el-tooltip placement="top"> <div slot="content">{{ generateAwesomeIconCode(item) }}</div> <div class="icon-item"> <v-icon :name="item" scale="2" :style="iconStyle" /> <span>{{ item }}</span> </div> </el-tooltip> </div> </el-tab-pane>
这样就能够实现对应图标的动态过滤和展现了。
列出一下前面几篇随笔的链接,供参考:
按部就班VUE+Element 前端应用开发(1)--- 开发环境的准备工做
按部就班VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用
按部就班VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理
按部就班VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理
按部就班VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展现和字段转义处理
按部就班VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用
按部就班VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数