table组件 commonTable.vue
<template>
<div class="table-common">
<el-table
ref="multipleTable"
v-loading="showLoading"
element-loading-text
element-loading-background="rgba(255, 255, 255, 0.7)"
:data="tableData"
:border="border"
style="width: 100%"
:height="height"
:row-class-name="rowClassName"
@selection-change="tableColumnChangeSelect"
@row-click="rowClick"
:row-key="getRowKey"
fit
empty-text
>
<el-table-column
v-if="selectionShow"
type="selection"
align="center"
width="80"
:selectable="selectable"
:reserve-selection="true"
/>
<el-table-column v-if="redioShow" :selectable="selectable" width="50">
<template slot-scope="scope">
<el-radio
v-model="redioVal"
:label="scope.row"
@change="tableColumnChangeRadio(scope.row)"
>
</el-radio>
</template>
</el-table-column>
<el-table-column v-if="index" type="index" label="序号" width="80" align="center">
<template slot-scope="scope">
<span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column
v-for="item in tableColumn"
:key="item.prop"
:align="item.align ? item.align : 'center'"
:show-overflow-tooltip="item.tooltip"
:prop="item.prop"
:label="item.label"
:width="item.width"
:fixed="item.fixed"
v-show="item.show"
>
<template slot-scope="scope">
<template v-if="item.slot">
<slot
:name="item.prop"
:row="scope.row"
:column="scope.column"
:index="scope.$index"
/>
</template>
<template v-else>
{{ scope.row[item.prop] ? scope.row[item.prop] : "--" }}
</template>
</template>
</el-table-column>
<el-table-column
v-if="
operates.hasOwnProperty('list')
? operates.list.filter((_x) => _x.show === true).length > 0
: false
"
ref="fixedColumn"
:align="operates.align || 'right'"
:label="operates.label || '操作'"
:fixed="operates.fixed"
:width="operates.width || '120'"
>
<template slot-scope="scope">
<div class="operate-group">
<template v-for="(btn, index) in operates.list">
<span v-if="btn.show" :key="index" class="operate-btn">
<el-button
:key="index"
size="small"
:type="btn.type || 'text'"
:disabled="btn.disabled"
@click="btn.methods(scope.row, index)"
>{{ btn.label }}</el-button
>
</span>
</template>
</div>
</template>
</el-table-column>
<template v-if="!showLoading && tableData.length === 0" slot="empty">
<span>暂无数据</span>
</template>
</el-table>
<common-paging
v-if="(showTotal && total) || total < 0"
:total="total"
:page="pageNum"
:size="pageSize"
@handleSizeChange="handleSizeChange"
@handleCurrentChange="handleCurrentChange"
/>
</div>
</template>
<script>
import commonPaging"./commonPaging.vue"
export default {
components: {commonPaging},
props: {
index: {
type: Boolean,
default: true,
},
tableLoading: {
type: Boolean,
default: false,
},
tableData: {
type: Array,
default: function () {
return [];
},
},
border: {
type: Boolean,
default: false,
},
tableColumns: {
type: Array,
default: function () {
return [];
},
},
total: {
type: [Number, String],
default: 0,
},
pageNum: {
type: [Number, String],
default: 1,
},
pageSize: {
type: [Number, String],
default: 5,
},
selectionShow: {
type: Boolean,
default: false,
},
redioShow: {
type: Boolean,
default: false,
},
operates: {
type: Object,
default: function () {
return {};
},
},
selectable: {
type: Function,
default: function () {
return true;
},
},
height: {
type: [Number, String],
default: null,
},
showTotal: {
type: Boolean,
default: true,
},
rowClassName: {
type: Function,
default: function () {},
},
handleSizeChange: {
type: Function,
default: function () {},
},
handleCurrentChange: {
type: Function,
default: function () {},
},
getRowKey: {
type: Function,
default: function () {
return null;
},
},
},
data() {
return {
redioVal: "1",
showLoading: false,
aSelection: [],
};
},
computed: {
tableColumn: function () {
return this.tableColumns.filter((item) => {
return item.show || item.show === undefined;
});
},
},
watch: {
tableLoading: {
deep: true,
handler(nVal, oVal) {
this.showLoading = nVal;
if (nVal === oVal) {
return;
}
if (nVal) {
setTimeout(() => {
this.showLoading = false;
}, 20000);
}
},
},
},
mounted() {},
methods: {
rowClick(row, column, event) {
this.$emit("row-click", row, column, event);
},
tableColumnChangeSelect(val) {
this.aSelection = JSON.parse(JSON.stringify(val));
this.$emit("tableColumnChangeSelect", val);
},
tableColumnChangeRadio(val) {
this.redioVal = val;
this.$emit("tableColumnChangeRadio", val);
},
},
};
</script>
<style scoped>
.operate-group {
display: flex;
justify-content: space-evenly;
}
</style>
分页组件 commonPaging.vue
<template>
<div>
<el-pagination
v-show="handleSizeChange && handleCurrentChange && total"
ref="pagination"
:class="[colors, 'pagination']"
background
:current-page="pagingPage"
:page-size="pagingSize"
:pager-count="5"
:page-sizes="[5, 10, 20]"
layout="total, slot, sizes, jumper, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</template>
<script>
export default {
props: {
page: {
type: Number,
default: 1,
},
size: {
type: Number,
default: 10,
},
total: {
type: Number,
default: 10,
},
palte: {
type: String,
default: "defalut",
validator: function (value) {
return ["bill", "fund", "interbank", "defalut"].indexOf(value) !== -1;
},
},
},
data() {
return {
pagingPage: 1,
pagingSize: 10,
};
},
computed: {
colors: function () {
var themeClass = "";
if (this.palte === "bill") {
themeClass = "pager-bill";
} else if (this.palte === "fund") {
themeClass = "pager-fund";
} else if (this.palte === "interbank") {
themeClass = "pager-interbank";
} else {
themeClass = "pager-defalut";
}
return themeClass;
},
},
watch: {
page: {
immediate: true,
handler(newVal, oldVal) {
console.log(newVal, oldVal);
this.pagingPage = newVal;
},
},
size: {
immediate: true,
handler(newVal, oldVal) {
this.pagingSize = newVal;
},
},
},
mounted() {
this.domOper();
},
methods: {
domOper() {
const jumper = document.getElementsByClassName("el-pagination__jump");
jumper[0].childNodes[0].nodeValue = "第";
},
handleCurrentChange(val) {
this.$emit("handleCurrentChange", val);
},
handleSizeChange(val) {
this.$emit("handleSizeChange", val);
},
},
};
</script>
table父级引用文件 demo.vue
<template>
<div>
<commonTable
:total="total"
:handle-current-change="handleCurrentChange"
:handle-size-change="handleSizeChange"
:table-data="tableData"
:table-columns="tableColumns"
:selection-show="true"
:redio-show="false"
:operates="operates"
@tableColumnChangeSelect="tableColumnChangeSelect"
:getRowKey="(row) => row.id"
>
<template #ecifCustNo="scope">
<div>{{ scope.row.ecifCustNo }}</div>
</template>
</commonTable>
</div>
</template>
<script>
import { tables } from "./index";
import commonTable from "./commonTable.vue"
export default {
components: {commonTable},
data() {
return {
tableData: [
{
ecifCustNo: "00006279179260",
limitNo: "ZHED000062791792600002",
custName: "北京蓝图******有限公司"
},
],
total: 1,
size: 10,
page: 1,
tableColumns: [],
operates: {
label:"工具栏",
fixed: "right",
align: "center",
list: [
{
label: "删除",
show: true,
disabled:true,
type: "danger",
methods: (row, index) => {
this.tableRemove(row, index);
},
},
{
label: "修改",
show: true,
disabled:false,
type: "warning",
methods: (row, index) => {
this.tableEdit(row, index);
},
},
],
},
};
},
mounted() {
this.tableColumns = tables;
},
methods: {
handleSizeChange(val) {
console.log(val);
this.size = val;
},
handleCurrentChange(val) {
console.log(val);
this.page = val;
},
tableRemove(val, i) {
console.log(val, i);
},
tableEdit(val, i) {
console.log(val, i);
},
tableColumnChangeSelect(list) {
console.log(list);
},
},
};
</script>
table父级表头配置文件 index.js
export const tables = [
{
prop: 'ecifCustNo',
label: '客户编号',
tooltip:true,
width:"100px",
fixed:false,
slot:true,
show:false,
},
{
prop: 'limitNo',
label: '额度编号',
},
{
prop: 'custName',
label: '客户名称'
}
]