wenmo8 发布的文章

在我们使用VUE+Element 处理界面的时候,往往碰到需要利用JS集合处理的各种方法,如Filter、Map、reduce等方法,也可以涉及到一些对象属性赋值等常规的处理或者递归的处理方法,以前对于这些不是很在意,但往往真正使用的时候,需要了解清楚,否则很容易脑袋出现短路的情况。本篇随笔列出一些在VUE+Element 前端开发中经常碰到的JS处理场景,供参考学习。

1、常规集合的filter、map、reduce处理方法

filter函数的主要用途是对数组元素进行过滤,并返回一个符合条件的元素的数组

const nums = [10,20,30,666666,222,333]
let newNums
=nums.filter(function(n){return n<100})

输出:[10,20,30]

map函数是对数组每个元素的映射操作,并返回一个新数组,原数组不会改变将newNums中每个数字乘2

const nums = [10,20,30,666666,222,333]
let newNums
=nums.map(function(n){return n*2})

输出:[20,40,60,222,666]

reduce函数主要用于对数组所有元素的汇总操作,如全部相加、相乘等

const nums = [10,20,30,666666,222,333]
let newNums
=nums.reduce(function(preValue,n){return PreValue+n
},
0)

输出:726

有时候可以结合几种处理方式一起,如下综合案例所示。

const nums = [10,20,30,666666,222,333]
let newNums
=nums.filter(function(n){return n<100}).map(function(n){return n*2}).reduce(function(preValue,n){return preValue+n
},
0)

结果:120

另外还有一个数组集合的find方法,和filter方法类似。

find()方法主要用来返回数组中
符合条件的第一个元素
(没有的话,返回undefined)

 var Array = [1,2,3,4,5,6,7];var result = Array.find(function(value){return value > 5;   //条件
});
console.log(result);
//6 console.log(Array);//[1,2,3,4,5,6,7]

同样我们也可以在vue里面,利用require.context的处理机制,遍历文件进行处理,也需要用到了filter,如下代码所示。

下面代码是我对某个文件夹里面的文件进行一个过滤处理操作

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

2、递归处理

有时候,我们需要从一个JSON集合里面,由于集合是嵌套的,如children里面还有chilren集合,根据某个关键属性进行查询,这种处理方式就要用到递归了。

例如我定义的一个菜单集合里面,就是这样一个嵌套的结构,需要根据名称来获得对应的对象的时候,就涉及到了一个递归处理函数。

首先我们来看看菜单的JSON集合。

//此菜单数据一般由服务器端返回
export const asyncMenus =[
{
id:
'1',
pid:
'-1',
text:
'首页',
icon:
'dashboard',
name:
'dashboard'},
{
id:
'2',
pid:
'-1',
text:
'产品信息',
icon:
'table',
children: [
{
id:
'2-1',
pid:
'2',
text:
'产品展示',
name:
'product-show',
icon:
'table'}]
},
{
id:
'3',
pid:
'-1',
text:
'杂项管理',
icon:
'example',
children: [
{
id:
'3-1',
pid:
'3',
text:
'图标管理',
name:
'icon',
icon:
'example'},{
id:
'3-3',
pid:
'3',
text:
'树功能展示',
name:
'tree',
icon:
'tree'},
{
id:
'3-2',
pid:
'3',
text:
'二级菜单2',
icon:
'tree',
children: [
{
id:
'3-2-2',
pid:
'3-2',
text:
'三级菜单2',
name:
'menu1-1',
icon:
'form'}]
}
]
}
]

如果我们需要根据ID来遍历查询,就是一个典型的递归查询处理。

    //根据菜单id来获取对应菜单对象
FindMenuById(menuList, menuid) {for (var i = 0; i < menuList.length; i++) {var item =menuList[i];if (item.id && item.id ===menuid) {returnitem
}
else if(item.children) {var foundItem = this.FindMenuById(item.children, menuid)if (foundItem) { //只有找到才返回 returnfoundItem
}
}
}
}

这里值得注意的是,不能在递归的时候,使用下面直接返回

return this.FindMenuById(item.children, menuid)

而需要判断是否有结果在进行返回,否则嵌套递归就可能返回undefined类型

  var foundItem = this.FindMenuById(item.children, menuid)if (foundItem) { //只有找到才返回
    returnfoundItem
}

3、forEach遍历集合处理

在很多场合,我们也需要对集合进行一个forEach的遍历处理,如下根据它的键值进行处理,注册全局过滤器的处理操作

//导入全局过滤器
import * as filters from './filters'
//注册全局过滤器
Object.keys(filters).forEach(key =>{
Vue.filter(key, filters[key])
})

或者我们在通过API方式获取数据后,对集合进行处理的操作

    //获取产品类型,用于绑定字典等用途
    GetProductType().then(data =>{if(data) {this.treedata = [];//树列表清空
        data.forEach(item =>{this.productTypes.set(item.id, item.name)this.typeList.push({ key: item.id, value: item.name })var node ={ id: item.id, label: item.name }this.treedata.push(node)
})
//获取列表信息 this.getlist()
}
});

又或者请求字典数据的时候,进行一个非空值的判断处理。

      //使用字典类型,从服务器请求数据
      GetDictData(this.typeName).then(data =>{if(data) {
data.forEach(item
=>{if (item && typeof (item.Value) !== 'undefined' && item.Value !== '') {
that.dictItems.push(item)
}
});
}
})

forEach()方法也是用于对数组中的每一个元素执行一次回调函数,
但它没有返回值
(或者说它的返回值为undefined,即便我们在回调函数中写了return语句,返回值依然为undefined)

注意: 如果forEach里有两个参数,则第一个参数为该集合里的元素,第二个参数为集合的索引;

4、Object.assign赋值方法

在有些场合,我们需要把全新的集合,复制到另一个对象上,替换原来对象的属性值,那么我们可以利用Object对象的assign方法。

如在编辑界面展示的时候,把请求到的对象属性复制到表单对象上。

      var param ={ id: id }
GetProductDetail(param).then(data
=>{
Object.assign(
this.editForm, data);
})

或者查询的时候,获得查询条件,进行部分替换

      //构造常规的分页查询条件
      var param ={
type:
this.producttype === 'all' ? '' : this.producttype,
pageindex:
this.pageinfo.pageindex,
pagesize:
this.pageinfo.pagesize
};
//把SearchForm的条件加入到param里面,进行提交查询 param.type = this.searchForm.ProductType //转换为对应属性 Object.assign(param, this.searchForm);

5、slice() 方法

slice() 方法可从已有的数组中返回选定的元素。

语法如下所示。

arrayObject.slice(start,end)

如下案例所示。

let red = parseInt(color.slice(0, 2), 16)
let green
= parseInt(color.slice(2, 4), 16)
let blue
= parseInt(color.slice(4, 6), 16)

或者我们结合filter函数对图标集合进行获取部分处理

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{returnlist;
}
}

为了方便读者理解,我列出一下前面几篇随笔的连接,供参考:

循序渐进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处理函数

循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用


循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用


循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理


循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示

循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

循序渐进VUE+Element 前端应用开发(17)--- 菜单管理

循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

VUE+Element 前端应用开发框架功能介绍

循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

循序渐进VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

电商商品数据库的设计和功能界面的处理

循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理

循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理

循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

使用代码生成工具快速开发ABP框架项目

使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理

使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题

在我前面随笔《
循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用
》里面曾经介绍过一些常规的界面组件的处理,主要介绍到单文本输入框、多文本框、下拉列表,以及按钮、图片展示、弹出对话框、表单处理,本篇随笔补充这一个主题,介绍树列表组件和下拉列表树组件在项目中的使用,以及一个SplitPanel的组件。

1、常规树列表控件的使用

众所周知,一般界面很多情况涉及到树列表的处理,如类型展示,如果是一层的,可以用下拉列表代替,如果是多个层级的,采用树控件展示会更加直观。

在Element里面也有一个el-tree的控件,如下所示,这里主要对它的各种属性和方法进行介绍。

简单的代码如下所示

<el-tree:data="data"@node-click="handleNodeClick"></el-tree>

主要在script部分里面指定它的data数据,以及单击节点的事件处理,结合卡片控件的展示,我们可以把树放在其中进行展示

界面代码如下所示,通过 default-expand-all 可以设置全部展开,icon-class 指定节点图标(也可以默认不指定)

        <el-cardclass="box-card">
          <divslot="header"class="clearfix">
            <span>树列表</span>
            <el-buttonstyle="float: right; padding: 3px 0"type="text">操作按钮</el-button>
          </div>
          <div>
            <el-treestyle="padding-top:10px":data="treedata"node-key="id"default-expand-all
icon-class
="el-icon-price-tag"highlight-current
@node-click
="handleNodeClick" > <spanslot-scope="{ node, data }"class="custom-tree-node"> <span> <i:class="node.icon ? node.icon : 'el-icon-price-tag'" />{{ node.label }}&nbsp;&nbsp; </span> </span> </el-tree> </div> </el-card>

其中界面里面,我们通过 class="custom-tree-node",来指定树列表的展现内容,可以加入图标等信息

而在script里面,定义了一个treedata的属性

      //初始化树列表
treedata: [
{
label:
'一级 1',
id:
'1',
children: [{
id:
'1-1',
label:
'二级 1-1',
children: [{
label:
'三级 1-1-1',
id:
'1-1-1'}, {
label:
'三级 1-1-2',
id:
'1-1-2'}, {
label:
'三级 1-1-3',
id:
'1-1-3'}]
}]
}
]

如果设置有选择框,得到界面如下所示。

主要设置  show-checkbox 和 @check-change="handleCheckChange" 即可。

界面代码如下所示

<el-treestyle="padding-top:10px":data="treedata"node-key="id"default-expand-all
highlight-current
show-checkbox
:default-checked-keys
="['1-1-1']"@node-click="handleNodeClick"@check-change="handleCheckChange" > <spanslot-scope="{ node, data }"class="custom-tree-node"> <span> <i:class="node.icon ? node.icon : 'el-icon-price-tag'" />{{ node.label }}&nbsp;&nbsp; </span> </span> </el-tree>

而对于树列表,可以进行一个过滤处理操作,如下界面所示。

在内容区增加一个input的文本框进行过滤处理,并绑定对应的属性变量

<el-inputv-model="filterText"placeholder="输入关键字进行过滤"clearable
prefix-icon
="el-icon-search" />

树列表控件需要增加过滤函数绑定 :filter-node-method="filterNode",如下代码所示。

<el-treeref="tree"class="filter-tree"style="padding-top:10px":data="treedata"node-key="id"default-expand-all
highlight-current
show-checkbox
:filter-node-method
="filterNode"@check-change="handleCheckChange"@node-click="handleNodeClick" > <spanslot-scope="{ node, data }"class="custom-tree-node"> <span> <i:class="node.icon ? node.icon : 'el-icon-price-tag'" />{{ node.label }}&nbsp;&nbsp; </span> </span> </el-tree>

script的处理代码如下所示,需要watch过滤的绑定值,变化就进行过滤处理。

为了在列表结合中进行快速的过滤,我们可以在上次介绍的列表界面里面增加一个树列表的快速查询处理。如下界面所示。

这里列表里面增加了一个第三方组件 splitpanes,用来划分区块展示,而且可以拖动,非常不错,地址是:
https://github.com/antoniandre/splitpanes

这个组件的Demo展示地址如下所示:
https://antoniandre.github.io/splitpanes

效果大概如下所示

npm 安装如下所示

npm i --S splitpanes

安装成功后,然后在vue文件的script部分里面引入即可

import { Splitpanes, Pane } from 'splitpanes'import'splitpanes/dist/splitpanes.css'

它的使用代码也很简单

<splitpanesstyle="height: 400px">
  <panemin-size="20">1</pane>
  <pane>
    <splitpaneshorizontal>
      <pane>2</pane>
      <pane>3</pane>
      <pane>4<pane>
    </splitpanes>
  </pane>
  <pane>5</pane>
</splitpanes>

我的列表界面使用了两个Panel即可实现左侧树的展示,和右侧常规列表查询的处理。

2、下拉框树列表的处理

除了常规的树列表展示内容外,我们也需要一个在下拉列表中展示树内容的界面组件。

这里又得引入一个第三方的界面组件,因此Element的Select组件不支持树列表。

GitHub地址:
https://github.com/riophae/vue-treeselect

官网地址:
https://vue-treeselect.js.org/

NPM安装:

npm install --save @riophae/vue-treeselect

界面代码如下所示。

<template>
  <divid="app">
    <treeselectv-model="value":multiple="true":options="options" />
  </div>
</template>

这里的value就是选中的集合,options则是树列表的节点数据。

<script>
  //import the component
import Treeselect from'@riophae/vue-treeselect'
  //import the styles
import'@riophae/vue-treeselect/dist/vue-treeselect.css'exportdefault{//register the component
components: { Treeselect },
data() {
return{//define the default value value:null,//define options options: [ {
id:
'a',
label:
'a',
children: [ {
id:
'aa',
label:
'aa',
}, {
id:
'ab',
label:
'ab',
} ],
}, {
id:
'b',
label:
'b',
}, {
id:
'c',
label:
'c',
} ],
}
},
}
</script>

我的测试界面代码如下所示

          <divstyle="height:180px">
            <!--v-model 绑定选中的集合
options 树节点数据
defaultExpandLevel 展开层次,Infinity为所有
flat 为子节点不影响父节点,不关联
--> <treeselectv-model="value":options="treedata":multiple="true":flat="true":default-expand-level="Infinity":open-on-click="true":open-on-focus="true"clearable
:max-height
="200" /> </div>
<script>
//import vue-treeselect component
import Treeselect from'@riophae/vue-treeselect'
//import the styles
import'@riophae/vue-treeselect/dist/vue-treeselect.css'exportdefault{
name:
'Tree',
components: { Treeselect },
data() {
return{//过滤条件 filterText:'',//初始化树列表 treedata: [
{
label:
'一级 1',
id:
'1',
children: [{
id:
'1-1',
label:
'二级 1-1',
children: [{
label:
'三级 1-1-1',
id:
'1-1-1'}, {
label:
'三级 1-1-2',
id:
'1-1-2'}, {
label:
'三级 1-1-3',
id:
'1-1-3'}]
}]
}
],
value: [
'1-1-2']
}
},
................
}
</script>

来一张几个树列表一起的对比展示界面。

以上就是普通树列表和下拉列表树展示的界面效果,往往我们一些特殊的界面处理,就需要多利用一些封装良好的第三方界面组件实现,可以丰富我们的界面展示效果。

为了方便读者理解,我列出一下前面几篇随笔的连接,供参考:

循序渐进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处理函数

循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用


循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用


循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理


循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示

循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

循序渐进VUE+Element 前端应用开发(17)--- 菜单管理

循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

VUE+Element 前端应用开发框架功能介绍

循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

循序渐进VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

电商商品数据库的设计和功能界面的处理

循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理

循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理

循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

使用代码生成工具快速开发ABP框架项目

使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理

使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题

我们开发的系统,一般可以不用考虑语言国际化的问题,大多数系统一般是给本国人使用的,而且直接使用中文开发界面会更加迅速 一些,不过框架最好能够支持国际化的处理,以便在需要的时候,可以花点时间来实现多语言切换的处理,使系统具有更广泛的受众用户。VUE+Element 前端应用实现国际化的处理还是非常方便的,一般在Main.js函数里面引入语言文件,然后在界面上进行一定的处理,把对应的键值转换为对应语言的语义即可。本篇随笔介绍在VUE+Element 前端应用中如何实现在界面快速的支持多语言国际化的处理逻辑代码。

1、main入口函数支持

Element 组件内部默认使用中文,若希望使用其他语言,则需要进行多语言设置。以英文为例,在 main.js 中:

//完整引入 Element
import Vue from 'vue'import ElementUI from'element-ui'import locale from'element-ui/lib/locale/lang/en'Vue.use(ElementUI, { locale })

由于我们现在是需要处理多语言的切换,那么,我们在src下面的一个目录里面创建一个lang目录,在其中里面编辑zh.js和en.js分别代表中英文语言对照信息,index.js文件则为引入这两个文件的处理关系。

在index.js里面,需要设置一个函数,用来获取Cookie里面存储的语言,如果没有找到,以浏览器国际化语言为准,如下代码所示。

export functiongetLanguage() {
const chooseLanguage
= Cookies.get('language')if (chooseLanguage) returnchooseLanguage//如果没有选择语言,那么使用浏览器语言 const language = (navigator.language ||navigator.browserLanguage).toLowerCase()
const locales
=Object.keys(messages)for(const locale of locales) {if (language.indexOf(locale) > -1) {returnlocale
}
}
return 'en'}

其中代码行

const locales = Object.keys(messages)

是获取message对象里面的键,如下所示。

import Vue from 'vue'import VueI18n from'vue-i18n'import Cookies from'js-cookie'import elementEnLocale from'element-ui/lib/locale/lang/en' //element-ui lang
import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'//element-ui lang
import enLocale from './en'import zhLocale from'./zh'Vue.use(VueI18n)//定义对应语言键,展开对应的键值对应表
const messages ={
en: {
...enLocale,
...elementEnLocale
},
zh: {
...zhLocale,
...elementZhLocale
}
}

其中message就是一个两个语言(en/zh)字典下的对照表,包含各自对应键值下的内容。

然后整个index.js文件就是公布对应的多语言处理接口和属性。

const i18n = newVueI18n({
locale: getLanguage(),
messages
})

export
default i18n

然后在main.js函数里面处理国际化的处理即可

Vue.use(ElementUI, {
size: Cookies.get(
'size') || 'medium', //set element-ui default size i18n: (key, value) =>i18n.t(key, value) })newVue({
el:
'#app',
router,
store,
i18n,
render: h
=>h(App)
})

有了这些准备,那么我们在界面上就可以调用对应的键来获取对应语言的语义了,

2、界面处理实现

首先,我们编辑一下对应国际化的键值内容,例如中文参照如下所示。

例如对应登录界面上,界面效果如下所示。

或者

其中里面的文本内容,我们都是以国际化处理内容。

如登陆表单里面的代码如下所示。

        <el-formref="loginForm":model="loginForm":rules="rules"class="loginForm">
          <el-form-itemprop="username"class="login-item">
            <el-inputv-model="loginForm.username"class="area"type="text":placeholder="$t('login.username')"prefix-icon="el-icon-user-solid"@keyup.enter.native="submitForm('loginForm')"
            />
          </el-form-item>
          <el-form-itemprop="password"class="login-item">
            <el-inputv-model="loginForm.password"class="area"type="password":placeholder="$t('login.password')"prefix-icon="el-icon-lock"@keyup.enter.native="submitForm('loginForm')"
            />
          </el-form-item>

          <el-form-item>
            <el-button:loading="loading"type="primary"class="submit_btn"@click="submitForm('loginForm')">{{ $t('login.logIn') }}</el-button>
          </el-form-item>
          <divclass="tiparea">
            <spanstyle="margin-right:20px;">{{ $t('login.username') }} : admin</span>
            <span> {{ $t('login.password') }} : {{ $t('login.any') }}</span>
          </div>
        </el-form>

我们多处采用了类似 $t('login.username') 的函数处理方式来动态获取对应语言的内容即可,其中$t()函数里面就是对应的语义解析的键参数,对应我们lang/zh.js里面或者lang/en.js里面的内容即可。

其中多语言切换的时候,单击图标就可以切换为其他语言内容了。

切换英文后界面如下所示

同样,其他地方,如果需要切换多语言的国际化处理,也可以使用$t的转义方式,在顶部导航栏里面,我们可以设置得到多语言支持的界面。

中文界面提示如下所示。

这部分的实现代码是在组件模块里面,一样可以实现国际化的处理的。

  <templatev-if="device!=='mobile'">
    <searchid="header-search"class="right-menu-item" />
    <error-logclass="errLog-container right-menu-item hover-effect" />
    <el-tooltip:content="$t('navbar.fullscreen')"effect="dark"placement="bottom">
      <screenfullid="screenfull"class="right-menu-item hover-effect" />
    </el-tooltip>
    <el-tooltip:content="$t('navbar.size')"effect="dark"placement="bottom">
      <size-selectid="size-select"class="right-menu-item hover-effect" />
    </el-tooltip>
    <el-tooltip:content="$t('navbar.language')"effect="dark"placement="bottom">
      <lang-selectclass="right-menu-item hover-effect" />
    </el-tooltip>
  </template>

为了方便读者理解,我列出一下前面几篇随笔的连接,供参考:

循序渐进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处理函数

循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用


循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用


循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理


循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示

循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

循序渐进VUE+Element 前端应用开发(17)--- 菜单管理

循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

VUE+Element 前端应用开发框架功能介绍

循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

循序渐进VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

电商商品数据库的设计和功能界面的处理

循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理

循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理

循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

使用代码生成工具快速开发ABP框架项目

使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理

使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题

在我们做应用系统的时候,往往都会涉及图表的展示,综合的图表展示能够给客户带来视觉的享受和数据直观体验,同时也是增强客户认同感的举措之一。基于图表的处理,我们一般往往都是利用对应第三方的图表组件,然后在这个基础上为它的数据模型提供符合要求的图表数据即可,VUE+Element 前端应用也不例外,我们这里使用了基于vue-echarts组件模块来处理各种图表vue-echarts是对echarts图表组件的封装。

1、图表组件的安装使用

首先使用npm 安装vue-echarts组件。

git地址:
https://github.com/ecomfe/vue-echarts

NPM安装命令

npm install echarts vue-echarts

然后在对应模块页面里面引入对应的组件对象,如下代码所示。

<script>import ECharts from'vue-echarts' //主图表对象
import'echarts/lib/chart/line' //曲线图表
import'echarts/lib/chart/bar' //柱状图
import'echarts/lib/chart/pie' //饼状图
import'echarts/lib/component/tooltip' //提示信息

接着在Vue组件里面对象中加入对象即可。

export default{
components: {
'v-chart': ECharts
},

如果是全局注册使用,那么可以在main.js里面进行加载

//注册组件后即可使用
Vue.component('v
-chart', VueECharts)

我们来看看图表展示的效果图

柱状图效果

饼状图

曲线图

其他类型,极坐标和散点图形

或者曲线和柱状图组合的图形

更多的案例可以参考官网的展示介绍:
https://echarts.apache.org/examples/zh/index.html

2、各种图表的展示处理

对于我们需要的各种常规的柱状图、饼状图、折线图(曲线图)等,我下来介绍几个案例代码,其他的一般我们根据官方案例提供的data数据模型,构造对应的数据即可生成,就不再一一赘述。

另外,我们也可以参考Vue-echarts封装的处理demo:
https://github.com/ecomfe/vue-echarts/tree/master/src/demo

对于柱状图,效果如下

在Vue模块页面的Template 里面,我们定义界面代码如下即可。

<v-chartref="simplebar":options="simplebar"autoresize/>

然后在data里面为它准备好数据即可,如下代码所示。

data() {return{
simplebar: {
title: { text:
'柱形图Demo'},
tooltip: {},
xAxis: {
data: [
'衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
},
yAxis: {},
series: [{
name:
'销量',
type:
'bar',
data: [
5, 20, 36, 10, 10, 20]
}]
}
}
}

当然我们也可以把这些构造对应数据的逻辑放在单独的JS文件里面,然后导入即可。

例如对于饼图,它的界面效果如下所示。

它的vue视图下,Template里面的代码如下所示。

<v-chartref="pie":options="pie"autoresize/>

一般对于图表的数据,由于处理代码可能不少,建议是独立放在一个JS文件里面,然后我们通过import导入即可使用。

然后在data里面引入对应的对象即可,如下所示。

<script>import ECharts from'vue-echarts' //主图表对象
import'echarts/lib/chart/line' //曲线图表
import'echarts/lib/chart/bar' //柱状图
import'echarts/lib/chart/pie'//饼状图
import'echarts/lib/component/tooltip' //提示信息

//导入报表数据
import getBar from'./chartdata/bar'import pie from'./chartdata/pie'import scatter from'./chartdata/scatter'import lineChart from'./chartdata/lineChart'import incomePay from'./chartdata/incomePay'exportdefault{
components: {
'v-chart': ECharts
},
return{
pie,
scatter,,
lineChart,
incomePay,
simplebar: {
title: { text:
'柱形图Demo'},
tooltip: {},
xAxis: {
data: [
'衬衫','羊毛衫','雪纺衫','裤子','高跟鞋','袜子']
},
yAxis: {},
series: [{
name:
'销量',
type:
'bar',
data: [
5,20,36,10,10,20]
}]
}
}
},

其中pie.js里面放置的是处理饼图数据的逻辑,如下代码所示。

export default{
title: {
text:
'饼图程序调用高亮示例',
x:
'center'},
tooltip: {
trigger:
'item',
formatter:
'{a} <br/>{b} : {c} ({d}%)'},
legend: {
orient:
'vertical',
left:
'left',
data: [
'直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']
},
series: [
{
name:
'访问来源',
type:
'pie',
radius:
'55%',
center: [
'50%', '60%'],
data: [
{ value:
335, name: '直接访问'},
{ value:
310, name: '邮件营销'},
{ value:
234, name: '联盟广告'},
{ value:
135, name: '视频广告'},
{ value:
1548, name: '搜索引擎'}
],
itemStyle: {
emphasis: {
shadowBlur:
10,
shadowOffsetX:
0,
shadowColor:
'rgba(0, 0, 0, 0.5)'}
}
}
]
}

在界面处理的时候,值得注意的时候,有时候Vue页面处理正常,但是图表就是没有出来,可能是因为高度或者宽度为0的原因,需要对对应的样式进行处理设置,以便能够正常显示出来。

如下是我 对图表的设置的样式处理,使得图表在一个卡片的位置能够显示正常。

<stylescoped>.echarts{width:100%;height:400px;}.el-row{margin-bottom:20px;
  }.el-col{border-radius:4px;margin-bottom:20px;
  }
</style>

最后几个界面组合一起的效果如下所示。

以上就是基于vue-echarts处理各种图表展示,其中常规的引入组件很容易的,主要就是需要根据对应的图表案例,参考数据组成的规则,从而根据我们实际情况构建对应的数据,赋值给对应的模型变量即可。

为了方便读者理解,我列出一下前面几篇随笔的连接,供参考:

循序渐进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处理函数

循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用


循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用


循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理


循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示

循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

循序渐进VUE+Element 前端应用开发(17)--- 菜单管理

循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

VUE+Element 前端应用开发框架功能介绍

循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

循序渐进VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

电商商品数据库的设计和功能界面的处理

循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理

循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理

循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

使用代码生成工具快速开发ABP框架项目

使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理

使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题

在VUE+Element 前端应用中,图标是必不可少点缀界面的元素,因此整合一些常用的图标是非常必要的,还好Element界面组件里面提供了很多常见的图标,不过数量不是很多,应该是300个左右吧,因此考虑扩展更多图标,我引入了
vue-awesome
组件,它利用了Font Awesome的内置图标,实现了更多图标的整合,可以在项目中使用更多的图标元素了,另外在本随笔的图标管理中,提供了对图标名称进行搜索,并根据图标颜色样式生成对应图标的代码,非常方便使用。

Vue-Awesome 是基于 Vue.js 的 SVG 图标组件,内置图标来自
Font Awesome

本篇随笔先来上一个图标管理的界面效果,然后在逐一进行介绍Element内置图标和Vue-Awesome的图标吧。

Element图标管理界面如下:

基于Vue-Awesome的图标管理如下所示。

其中查询提供了名称进行图标查询,以及限制一次性展示多少个,另外提供一个自定义颜色选项,从而可以改变图标的展示颜色。

1、Vue-Awesome的使用介绍

Vue-Awesome 的 npm的安装命令如下所示:

npm install vue-awesome

安装方式如下所示

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/
了解。

<!--基础用法-->
<v-iconname="beer"/>

<!--添加选项-->
<v-iconname="sync"scale="2"spin/>
<v-iconname="comment"flip="horizontal"/>
<v-iconname="code-branch"label="Forked Repository"/>

<!--堆叠图标-->
<v-iconlabel="No Photos">
  <v-iconname="camera"/>
  <v-iconname="ban"scale="2"class="alert"/>
</v-icon>

Vue-Awesome图标提供了一些prop的属性设置,参考下面列表所示。

  • 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.666666-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文件里面进行定义,然后全局统一加入即可。

使用上和其他的图标没有差异,只是名称不同而已。

    <divstyle="height:100px;padding:10px">
      <span>vue-Awesome 自定义图标:(在utils/awesome-icon-customed.js中引入)</span>
      <v-iconname="baidu"scale="2":style="iconStyle" />
      <v-iconname="vue"scale="2" />
      <v-iconname="webpack"scale="2"spin/>
      <v-iconname="html5-c"scale="2"spin/>
    </div>

2、导入Element 图标和Vue-Awesome图标

在我们进行页面管理的时候,我们需要提取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{returnlist
}
},
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{returnlist
}
}
},

然后在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-panelabel="Vue-Awesome 图标">
        <divv-for="item of vueAwesomeIconsFiltered":key="item"@click="handleClipboard(generateAwesomeIconCode(item),$event)"
        >
          <el-tooltipplacement="top">
            <divslot="content">{{ generateAwesomeIconCode(item) }}</div>
            <divclass="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处理函数

循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用


循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用


循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理


循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示

循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

循序渐进VUE+Element 前端应用开发(17)--- 菜单管理

循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

VUE+Element 前端应用开发框架功能介绍

循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

循序渐进VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

电商商品数据库的设计和功能界面的处理

循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理

循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理

循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

使用代码生成工具快速开发ABP框架项目

使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理

使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题