封装一个优雅的element ui表格组件
现在做后台系统用vue + elementUI 的越来越多,那element ui的 el-table 组件肯定也离不开。虽然element ui的table组件很好。但是表格和分页是分离的。每次写表格的时候都要写分页。这个就比较麻烦了。那我们可不可以把表格和分页封装在一起呢?照这个思路那我们重新封装一个带分页的表格。
思路:
- 表格组件要包含分页,不用每次都重新写分页
- 尽量保证el-table原生方法
- 方便易用
照这个思路我们开始写代码
先把表格和分页写在一起
<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表格组件的更多相关文章
- Element UI表格组件技巧:如何简洁实现跨页勾选、跨页统计功能
业务场景 在使用Element UI的Table组件时,常常面对这样的业务需求: 表格数据的每一项都要提供勾选框,当切换分页时,能够记忆所有页面勾选的数据,以实现批量提交不同页面勾选数据的功能.并且, ...
- [转]vue Element UI走马灯组件重写
https://blog.csdn.net/u013750989/article/details/82885482 1.element ui走马灯组件 -- carousel分析一波源代码:carou ...
- element ui 表格提交时获取所有选中的checkbox的数据
<el-table ref="multipleTable" :data="appList" @selection-change="changeF ...
- vue2.0+Element UI 表格前端分页和后端分页
之前写过一篇博客,当时对element ui框架还不太了解,分页组件用 html + css 自己写的,比较麻烦,而且只提到了后端分页 (见 https://www.cnblogs.com/zdd20 ...
- 如何优雅的设置UI库组件的属性?
UI库提供了很多组件,组件又带有很多属性,有一些常用属性我们可以记住并且手撸,但是有些不常用的属性,或者需要设置多个属性,这样的情况下写起来就麻烦了,有时候还要打开帮助文档看看属性是怎么设定的,需要设 ...
- vue + element ui 表格自定义表头,提供线上demo
前言:工作中用到 vue+element ui 的前端框架,需要使用自定义表头,需要使用 re.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9710826.h ...
- element ui step组件在另一侧加时间轴显示
这是我开发的时候遇到的一个问题:项目需要在步骤条(竖直方向)的另一侧加时间显示,但是我在element ui 的step组件中一直没找着设置方法,所以就自己想了个办法加进来,效果如下: 代码如下,先上 ...
- Element UI table组件源码分析
本文章从如下图所示的最基本的table入手,分析table组件源代码.本人已经对table组件原来的源码进行削减,源码点击这里下载.本文只对重要的代码片段进行讲解,推荐下载代码把项目运行起来,跟着文章 ...
- vue+element UI以组件递归方式实现多级导航菜单
介绍 这是一个是基于element-UI的导航菜单组件基础上,进行了二次封装的菜单组件,该组件以组件递归的方式,实现了可根据从后端接收到的json菜单数据,动态渲染多级菜单的功能. 使用方法 由于该组 ...
随机推荐
- CC13:回文链表
题目 请编写一个函数,检查链表是否为回文. 给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文. 测试样例: {1,2,3,2,1} 返回:true {1,2,3,2, ...
- python进阶07 MySQL
python进阶07 MySQL 一.MySQL基本结构 1.认识MySQL #MySQL不是数据库,它是数据库管理软件 #MySQL如何组织数据 #如何进入MySQL数据库 #其他注意事项 #以表格 ...
- [TCP/IP]OSI七层模型和TCP/IP四层模型
OSI參考模型 在過去的電腦網路上,由於資料通訊系統涉及複雜的軟硬體,可是又沒有統一的標準,導致通訊軟體不僅龐大複雜,而且不易測式.修改或分享.為此,ISO(國際標準組織)發展出一套OSI參考模型(O ...
- HDU 1027 G - Can you answer these queries?
http://acm.hdu.edu.cn/showproblem.php?pid=4027 Can you answer these queries? Time Limit: 4000/2000 M ...
- 项目部署到centos7云端验证码出现乱码
原因:linux系统字体和设置验证码的字体不一致 参考文献: https://www.whatled.com/post-6169.html 本次项目我使用的字体是 Arial
- c#的Lambda 表达式
首先看官方的说法: Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式 ...
- 第十七章 提升用户体验 之 使用MVC扩展功能控制程序行为
1. 概述 ASP.NET MVC具有很好的扩展性,每一个核心功能都可以被扩展.重写 和 定制. 本章内容包括:实现MVC过滤器和controller工厂.使用 action results,view ...
- VueJs $watch()方法总结!!
最近公司用vue框架写交互,之前没怎么写过,但是很多数据双向绑定的东东跟angular很像!所以上手很快!哈哈 今天就碰到一个vue的问题啊!!产品需求是,datetimepick时间选择器一更改时间 ...
- HBuilder 做移动端app流程
1.新建一个移动项目 2.编写代码 3.发行-发行为原生安装包,配置参数 选择icon 和引导页
- PADS 9.5封装向导 多一个管脚
使用PADS 9.5封装向导(Decal Wizard)建立封装(Decals) 时遇到封装的中间多了一个管脚,如图红圈位置,通过一番搜寻,才知道这是热焊盘,不需要就在右边的红圈处去掉勾选热焊盘即可.