1.自定义Tables.vue组件
<template>
<div class="tables-content">
<el-table v-loading="loading" v-bind="tableConfig">
<template v-for="(item, index) in columns">
<el-table-column v-if="item.slotName" :key="index" v-bind="item">
<template slot-scope="scope">
<slot :name="item.slotName" :scope="scope"></slot>
</template>
</el-table-column>
<el-table-column v-else :key="index" v-bind="item"></el-table-column>
</template>
</el-table>
<template v-if="pagerConfig.show">
<el-pagination
v-bind="pagerConfig"
@size-change="sizeChange"
@current-change="currentChange"
@prev-click="prevClick"
@next-click="nextClick"
></el-pagination>
</template>
</div>
</template>
<script>
export default {
name: "Tables",
props: {
loading: {
type: Boolean,
default: false
},
columns: {
type: Array,
default() {
return [];
}
},
tableConfig: {
type: Object,
default() {
return {};
}
},
pagerConfig: {
type: Object,
default() {
return {};
}
},
pagerEvent: {
type: Object,
default() {
return {};
}
}
},
data() {
return {};
},
methods: {
sizeChange(s) {
this.pagerEvent.sizeChange && this.pagerEvent.sizeChange(s);
},
currentChange(i) {
this.pagerEvent.currentChange && this.pagerEvent.currentChange(i);
},
prevClick(i) {
console.log(i);
this.pagerEvent.prevClick && this.pagerEvent.prevClick(i);
},
nextClick(i) {
this.pagerEvent.nextClick && this.pagerEvent.nextClick(i);
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped></style>
2.页面
<template>
<div>
<Tables
:loading="loading"
:columns="columns"
:tableConfig="tableConfig"
:pagerEvent="pagerEvent"
>
// 自定义列内容
<template slot="set" slot-scope="{ scope }">
<el-button size="mini" @click="handleEdit(scope.$index, scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="danger"
@click="handleDelete(scope.$index, scope.row)"
>删除</el-button
>
</template>
</Tables>
</div>
</template>
<script>
import Tables from "@/components/Tables";
export default {
data() {
return {
loading: false,
columns: [{
label: 'Id',
prop: 'id',
align: 'center'
}, {
label: '姓名',
prop: 'name',
align: 'center'
}],
tableConfig: {
border: true,
data: [{
id: '1',
name: '张三'
}, {
id: '2',
name: '李四'
},
{
label: "操作",
slotName: 'set',
align: "center"
}]
},
pagerConfig: {
show: true,
currentPage: 2,
pageiSzes: [100, 200, 300, 400],
pageSize: 100,
layout: "sizes, prev, pager, next",
total: 1000
},
pagerEvent: {
sizeChange:(s) => {
console.log(s)
},
currentChange:(i) => {
console.log(i)
},
prevClick:(i) => {
console.log(i)
},
nextClick:(i) => {
console.log(i)
}
},
methods: {
methods: {
handleEdit(i, row){
console.log(i,row);
},
handleDelete(i, row){
console.log(i,row);
},
}
},
components: {
Tables
},
}
}
</script>
<style lang="scss" scoped></style>
3.效果如图所示

4.遗留问题
- 事件的绑定不支持v-on="{}"的形式绑定,不知道有无更好的绑定方法
- 封装的table用于基本的table展示似乎没有问题,较为复杂的还没有实践有什么问题暂且未知
- table上的事件太多了,没有进行单独的绑定,需要的话可以自行绑定,绑定方式类似与分页器事件的绑定形式。(如果有那位大神有什么好的方式,也希望可以教教我)