在我们开发BS页面的时候,往往需要了解常规界面组件的使用,小到最普通的单文本输入框、多文本框、下拉列表,以及按钮、图片展示、弹出对话框、表单处理、条码二维码等等,本篇随笔基于普通表格业务的展示录入的场景介绍这些常规Element组件的使用,使得我们对如何利用Element组件有一个大概的认识。

1、列表界面和其他模块展示处理

在前面随笔《
循序渐进VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展示和字段转义处理
》介绍了基于列表展示了相关数据,并在列表界面整合了增删改查等常规的业务操作处理。

常规的列表展示界面,一般分为几个区域,一个是查询区域,一个是列表展示区域,一个是底部的分页组件区域。查询区域主要针对常规条件进行布局,以及增加一些全局或者批量的操作,如导入、导出、添加、批量添加、批量删除等按钮;而其中主体的列表展示区域,是相对比较复杂一点的地方,需要对各项数据进行比较友好的展示,可以结合Tag,图标,按钮等界面元素来展示,其中列表一般后面会包括一些对单行记录处理的操作,如查看、编辑、删除的操作,如果是批量删除,可以放到顶部的按钮区域。

对于常规按钮、表格、分页组件,前面已经做了相关的介绍,这里就不再赘述。

在介绍具体界面组件的时候,我们先来了解下,整体的界面布局,我们把常规的列表界面,新增、编辑、查看、导入等界面放在一起,除了列表页面,其他内容以弹出层对话框的方式进行处理,如下界面示意所示。

每个对话框的:visible的属性值,则是确定哪个模态对话框的显示和隐藏。

在Vue的JS模块里面,我们除了定义对应的对话框显示的变量外,对每个对话框,我们定义一个表单信息用来进行数据的双向绑定处理。

常规的新增、编辑、查看、导入等内容的定义,作为一个对话框组件定义,常规的对话框组件的使用代码如下所示。

<el-dialogtitle="提示":visible.sync="dialogVisible"width="30%":before-close="handleClose">
  <span>这是一段信息</span>
  <spanslot="footer"class="dialog-footer">
    <el-button@click="dialogVisible = false">取 消</el-button>
    <el-buttontype="primary"@click="dialogVisible = false">确 定</el-button>
  </span>
</el-dialog>

为了控制对话框的样式,我们这里注意下footer的slot,这个我们一般是把处理按钮放在这里,如对于查看界面对话框,我们定义如下所示。

一般来说,对于表单内容比较多的场景,我们一般分开多个选项卡进行展示或者录入,这样方便管理,查看界面整体效果如下所示。

对于对话框的数据绑定,我们在打开对话框前,先通过API模块请求获得JSON数据,然后绑定在对应的对话框模型属性上即可,如对于查看界面,我们的处理逻辑如下所示。

showView(id) {var param ={ id: id }
GetProductDetail(param).then(data
=>{
Object.assign(
this.viewForm, data);
})
this.isView = true},

对于表格的双击,我们同样绑定它的查看明细处理操作,如下模板代码和JS代码所示。

模板HTML代码如下:

<el-tablev-loading="listLoading":data="productlist"border
fit
stripe
highlight-current-row
:header-cell-style
="{background:'#eef1f6',color:'#606266'}"@selection-change="selectionChange"@row-dblclick="rowDbclick" >

JS逻辑代码如下

rowDbclick(row, column) {var id =row.IDthis.showView(id);
},

2、常规界面组件的使用

一般情况下,我们使用界面组件的时候,参考下官网《
Element组件使用
》,寻找对应组件的代码进行参考,就差不多了,这里还是就各种常规的Element组件进行大概的介绍吧。

1)表单和表单项、单文本框

对于表单,我们一般定义一个对应的名称,并设置它的data对应的模型名称即可,如下所示。

<el-formref="viewForm":model="viewForm"label-width="80px">

而表单项,一般是定义好表单项的Label即可,然后在其中插入对应的录入控件或者展示控件。如对于单文本组件使用,如下所示。

 <el-form-itemlabel="产品编号">
   <el-inputv-model="editForm.ProductNo" />
 </el-form-item>

其中 v-model="editForm.ProductNo"  就是对应绑定的数据。

而表单项,可以添加对字段的验证处理,在数据提交前,可以校验客户的录入是否有效等。

  <el-form-itemprop="email"label="邮箱":rules="[
{ required: true, message: '请输入邮箱地址', trigger: 'blur' },
{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
]"
> <el-inputv-model="dynamicValidateForm.email"></el-input> </el-form-item>

注意这里表单项,必须添加一个prop的属性设置,如 prop="email" 所示。

一般为了控制布局,我们还结合el-row进行一个布局的处理,如下代码所示(一行等于span为24,span=12也就是一行放两个控件组)。

<el-row>
  <el-col:span="12">
    <el-form-itemlabel="产品编号">
      <el-inputv-model="editForm.ProductNo" />
    </el-form-item>
  </el-col>
  <el-col:span="12">
    <el-form-itemlabel="条码">
      <el-inputv-model="editForm.BarCode" />
    </el-form-item>
  </el-col>
</el-row>

2)、下拉列表控件的绑定

下拉列表的绑定处理,也是通过 v-model 进行值的绑定,而选项则可以通过数据列表进行绑定。

<el-form-itemlabel="商品类型">
  <el-selectv-model="editForm.ProductType"filterable=""placeholder="请选择">
    <el-optionv-for="(item, key) in typeList":key="key":label="item.value":value="item.key"
    />
  </el-select>
</el-form-item>

而选项中的 typeList,我们可以在页面初始化的时候获取出来即可。

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

对于textarea常规的多行文本框,其实和普通单行文本框处理差不多,指定它的type="textarea" 和 rows的数值即可。

  <el-tab-panelabel="说明"name="second">
    <el-form-itemlabel="说明">
      <el-inputv-model="editForm.Description"type="textarea":rows="10" />
    </el-form-item>
  </el-tab-pane>

而对于一些可能需要展示HTML内容的,我们可以使用DIV控件来展示,通过v-html标识来处理包含HTML代码的内容。

  <el-tab-panelabel="详细说明">
    <el-form-itemlabel="详细说明">
      <divclass="border-radius"v-html="viewForm.Note" />
    </el-form-item>
  </el-tab-pane>

3)、图片展示

对于一些需要展示服务器图片,我们请求后,根据Element图片组件的设置处理即可,如下包括单个图片和多个图片的展示和预览操作。

图片展示的代码如下所示。

  <el-tab-panelabel="图片信息">
    <el-form-itemlabel="封面图片">
      <el-imagestyle="width: 100px; height: 100px":src="viewForm.Picture":preview-src-list="[viewForm.Picture]"
      />
    </el-form-item>
    <el-form-itemlabel="Banner图片">
      <el-imagestyle="width: 100px; height: 100px":src="viewForm.Banner":preview-src-list="[viewForm.Banner]"
      />
    </el-form-item>
    <el-form-itemlabel="商品展示图片">
      <el-imagev-for="item in viewForm.pics":key="item.key"class="border-radius":src="item.pic"style="width: 100px; height: 100px;padding:10px":preview-src-list="getPreviewPics()"
      />
    </el-form-item>
  </el-tab-pane>

上图中,如果是单个图片,那么预览我们设置一个集合为一个url即可,如 [viewForm.Banner],如果是多个图片,需要通过一个函数来获取图片列表,如 getPreviewPics() 函数所示。

getPreviewPics() {//转换ViewForm.pics里面的pic集合
      var list =[]if (this.viewForm.pics) {this.viewForm.pics.forEach(item =>{if(item.pic) {
list.push(item.pic)
}
})
}
returnlist
}

4)、第三方扩展控件

对于一些需要使用扩展组件的,我们一般搜索下解决方案,通过npm安装对应的组件即可解决,如对于条码和二维码,我使用 @chenfengyuan/vue-barcode和 @chenfengyuan/vue-qrcode,一般在Github上搜索下关键字,总能找到一些很受欢迎的第三方组件。

安装这些组件都有具体的说明,如下所示(
如果卸载,直接修改install为uninstall即可
)。

npm install @chenfengyuan/vue-barcode vue

以及

npm install @chenfengyuan/vue-qrcode vue

条码和二维码的展示效果如下所示

如果全局引入barcode和qrcode 组件,我们在main.js里面引入即可,如下代码所示

//引入barcode,qrcode
import VueBarcode from '@chenfengyuan/vue-barcode';
import VueQrcode from
'@chenfengyuan/vue-qrcode';
Vue.component(VueBarcode.name, VueBarcode);

富文本编辑,我这里采用了 Tinymce 第三方组件来实现编辑处理,展示效果如下所示。

代码如下所示

  <el-tab-panelabel="详细说明"name="third">
    <el-form-itemlabel="详细说明">
      <tinymcev-model="editForm.Note":height="300" />
    </el-form-item>
  </el-tab-pane>

以上就是一些常规的界面组件的使用,后面在继续介绍文件上传和图片结合的操作。

3、自定义组件的创建使用

使用Vue的比以往BS开发的好处,就是可以很容易实现组件化,这点很好,一旦我们定义好一个控件,就可以在多个界面里面进行使用,非常方便,而且封装性可以根据自己的需要进行处理。

查询区域一般的界面效果如下所示,除了包含一些常用的查询条件,一般会有一些下拉列表,这些可能是后台字典里面绑定的内容,可以考虑作为一个通用的字典下拉列表组件来做。

其实界面录入的时候,也往往需要这些条件下拉列表的。

那么我们来定义一个自定义组件,并在界面上使用看看。

在Components目录创建一个目录,并创建一个组件的vue文件,命名为my-dictdata.vue,如下所示。

界面模板代码我们就一个select组件为主即可。

<template>
  <el-selectv-model="svalue"filterable clearable placeholder="请选择">
    <el-optionv-for="(item, index) in dictItems":key="index":label="item.Text":value="item.Value"
    />
  </el-select>
</template>

script脚本逻辑代码如下所示。

<script>
//引入API模块类方法
import { GetDictData } from'@/api/dictdata'exportdefault{
name:
'MyDictdata',//组件的名称 props: {
typeName: {
//字典类型方式,从后端字典接口获取数据 type: String,default:''},
options: {
//固定列表方式,直接绑定 type: Array,default: ()=>{return[] }
}
},
data() {
return{
dictItems: [],
//设置的字典列表 svalue:'' //选中的值 }
},
watch: {
//判断下拉框的值是否有改变 svalue(val, oldVal) {if(val!==oldVal) {this.$emit('input',this.svalue);
}
}
},
mounted() {
varthat= this;if(this.typeName&& this.typeName!== '') {//使用字典类型,从服务器请求数据 GetDictData(this.typeName).then(data=>{if(data) {
data.forEach(item
=>{if(item&& typeof(item.Value)!== 'undefined' &&item.Value!== '') {
that.dictItems.push(item)
}
});
}
})
}
else if(this.options&& this.options.length> 0) {//使用固定字典列表 this.options.forEach(item=>{if(item&& typeof(item.Value)!== 'undefined' &&item.Value!== '') {
that.dictItems.push(item)
}
});
}
//设置默认值 this.svalue= this.value;
},
methods: {

}
}
</script>

主要就是处理字典数据的获取,并绑定到模型对象上即可。

在页面上使用前,需要引入我们定义的组件

import myDictdata from '@/components/Common/my-dictdata'

然后包含进去components里面即可

export default{
components: { myDictdata},

那么原来需要直接使用select组件的代码

<el-selectv-model="searchForm.ProductType"filterable clearable placeholder="请选择">
  <el-optionv-for="(item, key) in typeList":key="key":label="item.value":value="item.key"
  />
</el-select>

则可以精简为一行代码

<my-dictdatav-model="searchForm.ProductType"type-name="商品类型" />

而对于固定列表的,我们也可以通用的处理代码

<my-dictdatav-model="searchForm.Status":options="Status" />

其中Status是定义的一个对象集合

Status: [
{ Text:
'正常', Value: 0},
{ Text:
'推荐', Value: 1},
{ Text:
'停用', Value: 2}
]

是不是非常方便,而得到的效果则不变。

以上就是多个页面内容,通过对话框层模式整合在一起,并介绍如何使用,以及对界面中常见的Element组件进行介绍如何使用,以及定义一个字典列表的主定义组件,用于简化界面代码使用,

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

循序渐进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变量方式解决弹出编辑对话框界面无法触发更新的问题

标签: none

添加新评论