现在做后台系统用vue + elementUI 的越来越多,那element ui的 el-table 组件肯定也离不开。虽然element ui的table组件很好。但是表格和分页是分离的。每次写表格的时候都要写分页。这个就比较麻烦了。那我们可不可以把表格和分页封装在一起呢?照这个思路那我们重新封装一个带分页的表格。

思路:

  1. 表格组件要包含分页,不用每次都重新写分页
  2. 尽量保证el-table原生方法
  3. 方便易用

照这个思路我们开始写代码
先把表格和分页写在一起


<template>
<div>
<!-- 表格数据 -->
<el-table
highlight-current-row //点击当前行高亮
:data="tableDate" //表格数据
border //添加斑马线
:height="tableHeight" //表格高度
v-loading="loading" //loading动画
:size="size" //表格大小
@sort-change = "sortChange" //排序
@selection-change="selectionChange" //多选
@current-change="currentChange"
@row-click = "rowClick" //单行点击
style="width: 100%">
<slot></slot>
</el-table>
<el-pagination
v-if="paging"
@size-change="limitChange"
@current-change="pageChange"
:current-page.sync="params.page"
:page-size="params.limit"
:page-sizes="[10, 15, 20, 30, 50]"
layout="total, sizes, prev, pager, next, jumper"
:total="tableCount">
</el-pagination>
</div>
</template>
<script>
export default {
props: {
//请求接口
api: {
required: true
},
//参数 默认返回分页和条数
params: {
type: [Object,String,Number],
default: function() {
return { page: 1, limit: 15 };
}
},
// 尺寸
size: {
default: 'small'
},
// 分页
paging: {
default: true
}
},
data() {
return {
tableCount: 0, //总条数
tableDate: [], //表格数据
loading: false, //loading动画
};
},
created() {
this.init(this.params);
},
computed: {
// 实时更新server
server:function(){
return this.api.split('.')[0]
},
// 实时更新url
url:function(){
return this.api.split('.')[1]
},
tableHeight:function(){
return this.paging?'calc(100% - 32px)':'100%'
}
},
methods: {
init(params) {
this.loading = true;
//如果采用微服务的方式需要传微服务和url
this.$api[this.server][this.url](params)
.then(res => {
this.tableDate = res.data || [];
// 如果有分页
if(this.paging){
this.tableCount = res.count || 0;
this.params.page = res.curr || 0;
}
})
.finally(() => {
//关闭loading
this.loading = false;
});
},
// 重新请求 //如果需要重新请求使用$refs 调用这个方法
reload() {
// 如果有分页
if(this.paging){
this.params.page = 1;
}
// api动态加载完 开始重新请求数据
this.$nextTick(()=>{
this.init(this.params);
})
},
以下是对el-table原来的方法再次封装emit出去
// 多选
selectionChange(val){
this.$emit('selection-change',val)
},
// 单选
currentChange(currentRow, oldCurrentRow){
this.$emit('current-change',currentRow, oldCurrentRow)
},
rowClick(row, event, column){
this.$emit('row-click',row, event, column)
},
// 排序
sortChange(column, prop, order){
this.$emit('sort-change',column, prop, order)
},
// 表格翻页
pageChange(page) {
this.params.page = page;
this.init(this.params);
},
limitChange(limit){
this.params.limit = limit;
this.init(this.params);
},
}
};
</script>

别人使用起来非常简单 ,也不用再写任何请求方法
可以全局引入


<d-table
api="bizSystemService.getEmployeeList" //微服务名称+接口名称
:params="queryForm" //接口请求的参数. 默认是limit和page
ref="table"
size="small">
//下面的使用方式和el-table一样
<el-table-column
align="center"
label="序号"
width="50">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column
prop="roleTypeName"
align="center"
label="角色类型"
width="120">
<template slot-scope="scope">
<el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button>
<el-button type="text" size="small">编辑</el-button>
</template>
</d-table-column>
</el-table>

如果想刷新数据 使用reload方法即可. this.$refs.table.reload()

原文地址:https://segmentfault.com/a/1190000017346342

封装一个优雅的element ui表格组件的更多相关文章

  1. Element UI表格组件技巧:如何简洁实现跨页勾选、跨页统计功能

    业务场景 在使用Element UI的Table组件时,常常面对这样的业务需求: 表格数据的每一项都要提供勾选框,当切换分页时,能够记忆所有页面勾选的数据,以实现批量提交不同页面勾选数据的功能.并且, ...

  2. [转]vue Element UI走马灯组件重写

    https://blog.csdn.net/u013750989/article/details/82885482 1.element ui走马灯组件 -- carousel分析一波源代码:carou ...

  3. element ui 表格提交时获取所有选中的checkbox的数据

    <el-table ref="multipleTable" :data="appList" @selection-change="changeF ...

  4. vue2.0+Element UI 表格前端分页和后端分页

    之前写过一篇博客,当时对element ui框架还不太了解,分页组件用 html + css 自己写的,比较麻烦,而且只提到了后端分页 (见 https://www.cnblogs.com/zdd20 ...

  5. 如何优雅的设置UI库组件的属性?

    UI库提供了很多组件,组件又带有很多属性,有一些常用属性我们可以记住并且手撸,但是有些不常用的属性,或者需要设置多个属性,这样的情况下写起来就麻烦了,有时候还要打开帮助文档看看属性是怎么设定的,需要设 ...

  6. vue + element ui 表格自定义表头,提供线上demo

    前言:工作中用到 vue+element ui 的前端框架,需要使用自定义表头,需要使用 re.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9710826.h ...

  7. element ui step组件在另一侧加时间轴显示

    这是我开发的时候遇到的一个问题:项目需要在步骤条(竖直方向)的另一侧加时间显示,但是我在element ui 的step组件中一直没找着设置方法,所以就自己想了个办法加进来,效果如下: 代码如下,先上 ...

  8. Element UI table组件源码分析

    本文章从如下图所示的最基本的table入手,分析table组件源代码.本人已经对table组件原来的源码进行削减,源码点击这里下载.本文只对重要的代码片段进行讲解,推荐下载代码把项目运行起来,跟着文章 ...

  9. vue+element UI以组件递归方式实现多级导航菜单

    介绍 这是一个是基于element-UI的导航菜单组件基础上,进行了二次封装的菜单组件,该组件以组件递归的方式,实现了可根据从后端接收到的json菜单数据,动态渲染多级菜单的功能. 使用方法 由于该组 ...

随机推荐

  1. 目前最全的浏览器/CSS选择器兼容性总结(2009-8-10更新)

    2009年2月24日,Safari 4.0 beta版正式发布,Safari从它的3.2版本开始就已经支持所有的CSS选择器(包括最新的CSS3).不过为了方便大家的工作,下面提供了最新版本的CSS选 ...

  2. 常见的div布局面试题

    题目1:如何让一个子元素在父元素里水平垂直居中? 方法1 .box{width:400px;height:400px;background:#ccc;position:relative;} .chil ...

  3. MySql提示:The server quit without updating PID file(…)失败之解决办法(来源网络仅供参考)

    1.可能是/usr/local/mysql/data/rekfan.pid文件没有写的权限 解决方法 :给予权限,执行 “chown -R mysql:mysql /var/data” “chmod ...

  4. redis之使用

    redis之使用  redis ================================= 1.自动分配.你在什么时候用到了自动分配? 答:市场部或运营部招来的新的客户,单条(批量)录入数据的 ...

  5. MDX属性查询

    SELECT NON EMPTY { { { { { AddCalculatedMembers([会员.会员ID].[会员ID].Members), [会员.会员ID].[(All)] } } } } ...

  6. CQRS之旅——旅程4(扩展和增强订单和注册限界上下文)

    旅程4:扩展和增强订单和注册限界上下文 进一步探索订单和注册的有界上下文. "我明白,如果一个人想看些新鲜的东西,旅行并不是没有意义的."儒勒·凡尔纳,环游世界80天 对限界上下文 ...

  7. Linux上通过MySQL命令访问MySQL数据库时常见问题汇总

    Linux上通过mysql命令访问MySQL数据库时常见问题汇总 1)创建登录账号 #创建用户并授权 #允许本地访问 create user 'test'@'localhost' identified ...

  8. linux yum安装指定版本mysql

    1.下载mysql rpm包 cd /usr/local/src wget https://dev.mysql.com/get/mysql80-community-release-el7-.noarc ...

  9. RAC数据库后台进程介绍

    在RAC数据库上会比单实例数据库多一些进程,这些进程是RAC特有的,为了实现集群数据库功能而设置的. 10g RAC特有进程:$ ps -ef|grep ora_oracle    4721     ...

  10. UVA 11491 Erasing and Winning 奖品的价值 (贪心)

    题意:给你一个n位整数,让你删掉d个数字,剩下的数字要尽量大. 题解:因为最后数字位数是确定的,而且低位数字对答案的贡献是一定不及高位数字的,所以优先选择选最大且最靠左边的数字,但是有一个限制,选完这 ...