现在做背景体系用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()