背景

element-ui 中的 el-table 组件只提供了数据展示,而分页功能作为一个单独的组件 el-pagination,并没有像 Ant Design 一样集成到 el-able 组件中,并且每一个数据列也都是一个单独的组件 el-table-column。

在开发过程中就出现了一个很明显的问题:业务中的大部分数据表格功能都类似,数据列通常在3-6个不等,且都需要分页,前端分页与后端分页的逻辑又不相同,这就导致了每次写一个这样数据表格功能,都需要至少复制粘贴很多 el-table-column 组件和一套实现分页功能的代码。写代码最恼火的就是要复制粘贴很多重复的代码,一不小心就漏了些什么,有木有……

结合我最早使用的 easyui 中的 datagrid 组件,在 element-ui的基础上封装一个能满足大部分业务功能的 el-datagrid 组件,能大大的提高开发效率。

EasyUI 的 datagrid

接触的第一个 UI 框架是 jQuery 版本的 EasyUI,虽然样式是丑了一点,但个人觉得它的组件的封装,对开发人员是很友好的,基本上每个组件都可以用一个 对象或数组 去动态配置,很符合 数据驱动 的思维。

功能

大部分的业务(增删改查)中,数据表格通常有以下几个功能:

数据展示

排序

对每一行的操作(查看、修改、删除)

对整个数据表格的操作(新增、批量删除)

分页(前端 / 后端)

刷新数据

数据列配置(功能1、2、3 )

通常会从远程加载数据,将数据列配置成 数组,数组的每一项匹配远程数据中对象的属性,替代写多个 el-table-column 组件的麻烦。

远程数据格式:

{

data: [

{

name: 'lixiao 1',

email: 'lixiao 1@163.com'

},

……

{

name: 'lixiao 12',

email: 'lixiao 12@163.com'

}

],

total: 12

}

数据列配置如下:

columns: [

{

label: '姓名',

prop: 'name',

sortable: true

}, {

label: '邮箱',

prop: 'email',

sortable: true

}, {

label: '操作',

actions: [

{

label: '修改',

prop: 'edit',

type: 'warning',

icon: 'el-icon-edit'

}, {

label: '删除',

prop: 'delete',

type: 'danger',

icon: 'el-icon-delete'

}

]

}

]

label 表示列对应的表头,prop 表示列对应的远程数据中对象的属性,sortable 表示该列是否支持排序,actions 通常在最后一列,渲染一组操作按钮,采用 this.$emit('rowClick', { row, prop }) 的方式,向父组件 App.vue 传递一个 rowClick 事件,参数是一个包含了 该行数据 和 点击按钮的 prop 值(例如 edit / delete)的对象,在父组件中监听 rowClick 事件,判断 prop 的值即可做出不同的响应。

工具栏配置(功能4)

数据列配置能解决数据 增删改查 中的删、改、查,通常会在表格上方提供一组功能性按钮,例如新增、导出(部分 / 全量)、批量删除等功能,比较特殊的是批量删除这种功能需要获取到已经选中的行的数据。

toolbar: [

{

label: '新增',

prop: 'add',

type: 'primary',

icon: 'el-icon-plus',

}, {

label: '删除多行',

prop: 'delete',

type: 'danger',

icon: 'el-icon-delete',

usableAfterSelect: true

}

]

同样使用 this.$emit('toolbarClick', { rows, prop }) 的方式向父组件传递一个 toolbarClick 事件,不同的是,rows 是一个包含了多行数据的数组(当然也可能是一个空数组),父组件中监听 toolbarClick 事件,判断 prop 值和 rows 长度即可做出不同的响应。

对于需要 至少选择一行 才能进行操作的功能,参考了 Ant Design 例子中的交互,设置 usableAfterSelect 属性为 true 之后,选中至少一行之前按钮不可用。

分页(功能5)

前端分页

第一次获取数据之后,切换页码、切换每页数量只需要利用 slice 截取原始数据数组中对应数量的数据。

后端分页

每次切换页码和切换每页数量都需要重新获取数据,将返回的全部数据都作为要显示的原始数据。

// ElDatagrid.vue

// this.index 表示显示的数据的序号,表头为 #

computed: {

showData() {

if (this.clientPagination) {

// 若客户端分页,则根据页码和每页数量 截取相应的数据

return this.data.slice().splice(this.index - 1, this.pageSize);

} else {

// 若服务端分页,则直接显示获取到的数据

return this.data.slice();

}

}

},

刷新数据(功能6)

刷新数据指仅刷新数据表格的数据,而不是刷新整个页面。而触发刷新的操作往往是由父组件发起的,就变成了,如何让父组件通知子组件重新发请求获取数据。

实现这个功能我尝试了好几种方法:

最难看的 bus 中央事件总线。每个子组件实例都与父组件有一个不冲突的事件名做关联,用起来不方便

在子组件中 watch 一个传递过来的 prop 值的变化,那父组件需要更新数据的时候还是需要改变那个传递给子组件的值,嗯,new Date() 肯定是一直在变的……使用仍然不是很方便

父组件中通过 $refs 访问子组件,调用子组件的方法。原来有这么简单又好用的方法

methods: {

reloadDatagrid() {

this.$refs['datagrid'].reload();

}

}

datagrid vue_类似 easyui 中 datagrid 使用习惯的 element-ui 数据表格组件(el-datagrid)...相关推荐

  1. DataGrid( 数据表格) 组件[5]

    本节课重点了解 EasyUI 中 DataGrid(数据表格)组件的使用方法,这个组件依赖于 Panel(面板).Resizeable(调整大小).LinkButton(按钮).Pageination ...

  2. slickgrid 中ajax,slickgrid.js 一种高性能web数据表格组件的探讨

    本文将探讨一种高性能web数据表格组件的实现,首先简单介绍slickgrid这个前人开发的组件,接着对该组件的设计和实现思路进行讨论,最后对该组件的思想进行提炼,实现基于原始思想的新组件. slick ...

  3. element ui el-dialog子组件放到表格中title一直居中

    1.背景和问题 背景:子组件放在表格column中,子组件有个button和el-dialog 问题:el-dialog弹窗一直居中,center样式设置为true也不行 2.解决方式 原因:表格列默 ...

  4. Element ui Table表格匹配字典项中的数据

    在工作中通常会遇到Table表格匹配字典项中的数据这里介绍几种方法大家仅供参考 <el-table:data="tableData"style="width: 10 ...

  5. vue项目中实现下载后端返回的excel数据表格

    查看更多资源 1. 案例简介: vue项目中,客户端需要实现以excel表格形式下载数据,后端为java,接受请求 >> 读取数据库 >> 生成excel >> 返 ...

  6. Easyui中DataGrid(数据表格)

    Easyui中DataGrid(数据表格) 1.DataGrid简介 2.实现过程 2.1jsp页面的代码块(两种方式) 第一种 第二种 3.DataGrid属性 4.实践操作 4.1界面创建 4.2 ...

  7. jQuery EasyUI API 中文文档 - DataGrid 数据表格

    扩展自 $.fn.panel.defaults ,用 $.fn.datagrid.defaults 重写了 defaults . 依赖 panel resizable linkbutton pagin ...

  8. jQuery EasyUI API 中文文档 - 数据表格(DataGrid)

    DataGrid  数据表格 博客园 风流涕淌 (philoo.cnblogs.com) 翻译.不当之处,敬请指正.转载请保留出处!   扩展自 $.fn.panel.defaults ,用 $.fn ...

  9. easyui—DataGrid(数据表格)

    目录 一.DataGrid(数据表格) 一.DataGrid(数据表格) DataGrid以表格形式展示数据,并提供了丰富的选择.排序.分组和编辑数据的功能支持.DataGrid的设计用于缩短开发时间 ...

最新文章

  1. lambda表达式python_Python中的Lambda表达式
  2. 【转】ubuntu下修改文件夹权限
  3. 【网络安全员】需要了解的一项攻击技术-高隐匿、高持久化威胁
  4. Python 获取当前文件夹所有文件名并写入到excel文件中
  5. C++ Primer 第11章 习题11.16
  6. 如何下载python模块_python中模块包的离线下载教程
  7. 030_磁盘调度策略比较
  8. git学习(七)新建远程仓库-Gitee为例
  9. 省选专练[USACO18JAN]Stamp Painting
  10. 一个apk调用另一个apk的某个activity
  11. JAVA代码编译流程
  12. 数据分析的坑,都在统计学里埋过
  13. BME280测湿度温度
  14. 群晖NAS安装cpolar内网穿透套件(群晖6.X版)
  15. built a JNCIS LAB系列:Chapter 7 MPLS
  16. 经典分子动力学势能模型拟合程序atomicrex介绍
  17. 学习-Java循环while之求非负数之和
  18. Android Studio学习开发笔记--基础
  19. leetcode406:const、、static
  20. 10个Python爬虫实战项目

热门文章

  1. Action framework BAdI Definition TRIGGER_EXECUTED
  2. Regarding empty field check in business document save
  3. 使用form上传文件到application server的另一种办法
  4. 如何使用TCP套接字的端口来区分是哪个客户端发起的连接
  5. Docker镜像的目录存储讲解
  6. 【Linux】基础知识
  7. matlab中nc文件,MATLAB读取.nc文件
  8. mysql 创建账号权限_mysql创建用户,并指定用户的权限(grant命令)
  9. 位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)
  10. xampp mysql创建表_xampp怎样创建数据表和删除数据表 来学习吧