|
@@ -1,8 +1,8 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <!-- 表格 + 分页 -->
|
|
|
|
|
<div class="tablePaganations">
|
|
<div class="tablePaganations">
|
|
|
<a-config-provider :locale="locale">
|
|
<a-config-provider :locale="locale">
|
|
|
<a-table
|
|
<a-table
|
|
|
|
|
+ id="commonTable"
|
|
|
class="ant-table-striped"
|
|
class="ant-table-striped"
|
|
|
bordered
|
|
bordered
|
|
|
size="small"
|
|
size="small"
|
|
@@ -11,7 +11,7 @@
|
|
|
:data-source="dataSource"
|
|
:data-source="dataSource"
|
|
|
:columns="columns"
|
|
:columns="columns"
|
|
|
:row-key="(record) => record.id"
|
|
:row-key="(record) => record.id"
|
|
|
- :scroll="scrollValue"
|
|
|
|
|
|
|
+ :scroll="{ y: yScroll }"
|
|
|
:pagination="havePage ? pagination : false"
|
|
:pagination="havePage ? pagination : false"
|
|
|
:row-class-name="
|
|
:row-class-name="
|
|
|
(_record, index) => (index % 2 === 1 ? 'table-striped' : null)
|
|
(_record, index) => (index % 2 === 1 ? 'table-striped' : null)
|
|
@@ -49,43 +49,54 @@ import {
|
|
|
defineEmits,
|
|
defineEmits,
|
|
|
defineExpose,
|
|
defineExpose,
|
|
|
watch,
|
|
watch,
|
|
|
|
|
+ onMounted,
|
|
|
} from 'vue';
|
|
} from 'vue';
|
|
|
|
|
+import { getTableScroll } from '../common/tableScroll.js';
|
|
|
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN';
|
|
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN';
|
|
|
const locale = ref(zhCN);
|
|
const locale = ref(zhCN);
|
|
|
|
|
+
|
|
|
const props = defineProps({
|
|
const props = defineProps({
|
|
|
|
|
+ // 表格数据
|
|
|
dataSource: {
|
|
dataSource: {
|
|
|
type: Object,
|
|
type: Object,
|
|
|
required: true,
|
|
required: true,
|
|
|
},
|
|
},
|
|
|
|
|
+ // 表头数据
|
|
|
columns: {
|
|
columns: {
|
|
|
type: Object,
|
|
type: Object,
|
|
|
required: true,
|
|
required: true,
|
|
|
},
|
|
},
|
|
|
|
|
+ // 是否可选择
|
|
|
isSelect: {
|
|
isSelect: {
|
|
|
type: Boolean,
|
|
type: Boolean,
|
|
|
},
|
|
},
|
|
|
|
|
+ // 表格loading
|
|
|
isLoading: {
|
|
isLoading: {
|
|
|
type: Boolean,
|
|
type: Boolean,
|
|
|
},
|
|
},
|
|
|
|
|
+ // 数据总数
|
|
|
total: {
|
|
total: {
|
|
|
type: Number,
|
|
type: Number,
|
|
|
default: 0,
|
|
default: 0,
|
|
|
},
|
|
},
|
|
|
|
|
+ // 是否分页
|
|
|
havePage: {
|
|
havePage: {
|
|
|
type: Boolean,
|
|
type: Boolean,
|
|
|
default: true,
|
|
default: true,
|
|
|
},
|
|
},
|
|
|
- scrollValue: {
|
|
|
|
|
- type: Object,
|
|
|
|
|
- default: () => ({ y: 900 }),
|
|
|
|
|
|
|
+ // 表格距底部高度
|
|
|
|
|
+ extraHeight: {
|
|
|
|
|
+ type: Number,
|
|
|
|
|
+ default: undefined,
|
|
|
},
|
|
},
|
|
|
|
|
+ // 选择的key值
|
|
|
selectedKeys: {
|
|
selectedKeys: {
|
|
|
type: Array,
|
|
type: Array,
|
|
|
default: () => [],
|
|
default: () => [],
|
|
|
},
|
|
},
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
-const emit = defineEmits(['getPage', 'getTableSort', 'getSelectColumn']);
|
|
|
|
|
|
|
+const emit = defineEmits(['getPager', 'getSorter', 'getSelected']);
|
|
|
|
|
|
|
|
// 分页配置
|
|
// 分页配置
|
|
|
const pagination = reactive({
|
|
const pagination = reactive({
|
|
@@ -100,46 +111,85 @@ const pagination = reactive({
|
|
|
onChange: (current, pageSize) => changePage(current, pageSize), //点击页码事件
|
|
onChange: (current, pageSize) => changePage(current, pageSize), //点击页码事件
|
|
|
total: props.total,
|
|
total: props.total,
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+const yScroll = ref(400); //默认滚动高度
|
|
|
|
|
+const extraHeight = ref(undefined); //表格距离底部值
|
|
|
|
|
+
|
|
|
|
|
+// 最后一次排序信息
|
|
|
const lastSorter = reactive({ field: '', order: '' });
|
|
const lastSorter = reactive({ field: '', order: '' });
|
|
|
-// 选择数据
|
|
|
|
|
|
|
+
|
|
|
|
|
+// 选择的数据
|
|
|
const state = reactive({
|
|
const state = reactive({
|
|
|
selectedRows: [],
|
|
selectedRows: [],
|
|
|
selectedRowKeys: [],
|
|
selectedRowKeys: [],
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
-// 改变每页数量时更新显示
|
|
|
|
|
-const showSizeChange = (current, pageSize) => {
|
|
|
|
|
- setTimeout(() => {
|
|
|
|
|
- pagination.current = 1;
|
|
|
|
|
- emit('getPage', pagination.current, pageSize);
|
|
|
|
|
|
|
+onMounted(() => {
|
|
|
|
|
+ if (!props.havePage) {
|
|
|
|
|
+ extraHeight.value = 30;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ extraHeight.value = props.extraHeight;
|
|
|
|
|
+ }
|
|
|
|
|
+ onResizeTable();
|
|
|
|
|
+ window.onresize = () => {
|
|
|
|
|
+ onResizeTable();
|
|
|
|
|
+ };
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+// 表格位置
|
|
|
|
|
+const onResizeTable = () => {
|
|
|
|
|
+ yScroll.value = getTableScroll({
|
|
|
|
|
+ extraHeight: extraHeight.value,
|
|
|
|
|
+ id: 'commonTable',
|
|
|
});
|
|
});
|
|
|
- pagination.pageSize = pageSize;
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
//点击页码事件
|
|
//点击页码事件
|
|
|
const changePage = (current, size) => {
|
|
const changePage = (current, size) => {
|
|
|
pagination.current = current;
|
|
pagination.current = current;
|
|
|
- emit('getPage', pagination.current, size);
|
|
|
|
|
|
|
+ emit('getPager', pagination.current, size);
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+// 改变每页数量时更新显示
|
|
|
|
|
+const showSizeChange = (current, pageSize) => {
|
|
|
|
|
+ setTimeout(() => {
|
|
|
|
|
+ pagination.current = 1;
|
|
|
|
|
+ emit('getPager', pagination.current, pageSize);
|
|
|
|
|
+ });
|
|
|
|
|
+ pagination.pageSize = pageSize;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 回到第一页
|
|
// 回到第一页
|
|
|
const backFirstPage = () => {
|
|
const backFirstPage = () => {
|
|
|
pagination.current = 1;
|
|
pagination.current = 1;
|
|
|
- emit('getPage', pagination.current, pagination.pageSize);
|
|
|
|
|
|
|
+ emit('getPager', pagination.current, pagination.pageSize);
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+// 伸缩列
|
|
|
|
|
+const handleResizeColumn = (w, col) => {
|
|
|
|
|
+ col.width = w;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 选择每一项操作
|
|
// 选择每一项操作
|
|
|
-const selectEvent = (record, selected, selectedRows) => {
|
|
|
|
|
- state.selectedRows = selectedRows.map(pro => pro);
|
|
|
|
|
- state.selectedRowKeys = selectedRows.map(pro => pro.id);
|
|
|
|
|
- emit('getSelectColumn', state);
|
|
|
|
|
|
|
+const selectEvent = (record, selected) => {
|
|
|
|
|
+ if (selected) {
|
|
|
|
|
+ state.selectedRows.push(record);
|
|
|
|
|
+ state.selectedRowKeys.push(record.id);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ let index = state.selectedRowKeys.indexOf(record.id);
|
|
|
|
|
+ if (index >= 0) {
|
|
|
|
|
+ state.selectedRows.splice(index, 1);
|
|
|
|
|
+ state.selectedRowKeys.splice(index, 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ emit('getSelected', state);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// 点击以后全选当前分页数据
|
|
// 点击以后全选当前分页数据
|
|
|
const selectAllEvent = (selected, selectedRows, changeRows) => {
|
|
const selectAllEvent = (selected, selectedRows, changeRows) => {
|
|
|
if (selected) {
|
|
if (selected) {
|
|
|
- state.selectedRows = selectedRows;
|
|
|
|
|
changeRows.forEach(item => {
|
|
changeRows.forEach(item => {
|
|
|
|
|
+ state.selectedRows.push(item);
|
|
|
state.selectedRowKeys.push(item.id);
|
|
state.selectedRowKeys.push(item.id);
|
|
|
});
|
|
});
|
|
|
} else {
|
|
} else {
|
|
@@ -151,14 +201,16 @@ const selectAllEvent = (selected, selectedRows, changeRows) => {
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
- emit('getSelectColumn', state);
|
|
|
|
|
|
|
+ emit('getSelected', state);
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
// 清空选择
|
|
// 清空选择
|
|
|
const clear = () => {
|
|
const clear = () => {
|
|
|
state.selectedRowKeys = [];
|
|
state.selectedRowKeys = [];
|
|
|
state.selectedRows = [];
|
|
state.selectedRows = [];
|
|
|
- emit('getSelectColumn', state);
|
|
|
|
|
|
|
+ emit('getSelected', state);
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
// 获取排序信息
|
|
// 获取排序信息
|
|
|
const tableChange = (pagination, filters, sorter) => {
|
|
const tableChange = (pagination, filters, sorter) => {
|
|
|
// pagination, filters 变化时也会触发所以对sorter进行判断限制执行
|
|
// pagination, filters 变化时也会触发所以对sorter进行判断限制执行
|
|
@@ -166,24 +218,22 @@ const tableChange = (pagination, filters, sorter) => {
|
|
|
if (sorter.field != lastSorter.field && sorter.order != lastSorter.order) {
|
|
if (sorter.field != lastSorter.field && sorter.order != lastSorter.order) {
|
|
|
lastSorter.field = sorter.field;
|
|
lastSorter.field = sorter.field;
|
|
|
lastSorter.order = sorter.order;
|
|
lastSorter.order = sorter.order;
|
|
|
- emit('getTableSort', sorter);
|
|
|
|
|
|
|
+ emit('getSorter', sorter);
|
|
|
}
|
|
}
|
|
|
if (sorter.field != lastSorter.field && sorter.order == lastSorter.order) {
|
|
if (sorter.field != lastSorter.field && sorter.order == lastSorter.order) {
|
|
|
lastSorter.field = sorter.field;
|
|
lastSorter.field = sorter.field;
|
|
|
lastSorter.order = sorter.order;
|
|
lastSorter.order = sorter.order;
|
|
|
- emit('getTableSort', sorter);
|
|
|
|
|
|
|
+ emit('getSorter', sorter);
|
|
|
}
|
|
}
|
|
|
if (sorter.field == lastSorter.field && sorter.order != lastSorter.order) {
|
|
if (sorter.field == lastSorter.field && sorter.order != lastSorter.order) {
|
|
|
lastSorter.field = sorter.field;
|
|
lastSorter.field = sorter.field;
|
|
|
lastSorter.order = sorter.order;
|
|
lastSorter.order = sorter.order;
|
|
|
- emit('getTableSort', sorter);
|
|
|
|
|
|
|
+ emit('getSorter', sorter);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
-// 伸缩列
|
|
|
|
|
-const handleResizeColumn = (w, col) => {
|
|
|
|
|
- col.width = w;
|
|
|
|
|
-};
|
|
|
|
|
|
|
+
|
|
|
|
|
+// 暴露出方法
|
|
|
defineExpose({ backFirstPage, clear });
|
|
defineExpose({ backFirstPage, clear });
|
|
|
|
|
|
|
|
// 监听total变化
|
|
// 监听total变化
|
|
@@ -191,10 +241,7 @@ watch(
|
|
|
props,
|
|
props,
|
|
|
newData => {
|
|
newData => {
|
|
|
pagination.total = newData.total;
|
|
pagination.total = newData.total;
|
|
|
- if (newData.selectedKeys && newData.selectedKeys.length > 0) {
|
|
|
|
|
- state.selectedRowKeys = newData.selectedKeys;
|
|
|
|
|
- emit('getSelectColumn', state);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ extraHeight.value = newData.extraHeight;
|
|
|
},
|
|
},
|
|
|
{ immediate: true, deep: true },
|
|
{ immediate: true, deep: true },
|
|
|
);
|
|
);
|
|
@@ -205,7 +252,7 @@ const renderArr = Object.keys(slots);
|
|
|
<style scoped>
|
|
<style scoped>
|
|
|
.tablePaganations {
|
|
.tablePaganations {
|
|
|
width: 100%;
|
|
width: 100%;
|
|
|
- margin-top: 20px;
|
|
|
|
|
|
|
+ margin-top: 8px;
|
|
|
}
|
|
}
|
|
|
.ant-table-striped :deep(.table-striped) td {
|
|
.ant-table-striped :deep(.table-striped) td {
|
|
|
background-color: #fafafa;
|
|
background-color: #fafafa;
|