table.vue
3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<script setup lang="ts">
import { computed, ref } from 'vue';
import usePagination from '@/hooks/pagination';
import { Table, Row, Col } from '@arco-design/web-vue';
import { AnyObject, sizeType } from '@/types/global';
type PropType = {
loading?: boolean;
rowKey?: string;
hoverType?: string;
hidePage?: boolean;
simplePage?: boolean;
pageSize?: number;
size?: sizeType;
onQuery: (params?: AnyObject) => Promise<any>;
};
defineEmits<{
(e: 'rowSort', dataIndex: string, direction: string): void;
}>();
const props = withDefaults(defineProps<PropType>(), { loading: false, rowKey: 'id', size: 'small', pageSize: 20 });
const { pagination, setPage, setPageSize, setTotal } = usePagination({
simple: props.simplePage,
size: props.size,
pageSize: props.pageSize,
});
const list = ref<any[]>([]);
const tableRef = ref();
const pageQueryParams = computed(() => {
return props.hidePage ? {} : { page: pagination.value.current, pageSize: pagination.value.pageSize };
});
const hoverType = computed(() => props.hoverType || 'default');
const onFetch = () =>
props.onQuery(pageQueryParams.value).then(({ data, meta }) => {
list.value = data;
setPage(props.hidePage ? 1 : meta.current);
setTotal(props.hidePage ? data.length : meta.total);
setPageSize(props.hidePage ? pagination.value.pageSize : meta.limit);
});
const onPageChange = (page: number) => {
setPage(page || 1);
onFetch();
};
const onSizeChange = (size: number) => {
setPageSize(size);
setPage(1);
onFetch();
};
const onPush = (row: unknown) => {
list.value.unshift(row);
// eslint-disable-next-line no-plusplus
++pagination.value.total;
};
const onRemove = (index: number) => {
list.value.splice(index, 1);
// eslint-disable-next-line no-plusplus
--pagination.value.total;
};
const resetSort = () => tableRef.value?.clearSorters();
const getPagination = () => pagination.value;
const getCount = () => pagination.value.total;
const getList = () => list.value;
const formatSortType = (type: string): string => type?.replace('end', '') ?? '';
defineExpose({ onFetch, onPageChange, onSizeChange, resetSort, getCount, getPagination, getList, onPush, onRemove });
</script>
<template>
<Row justify="space-between" align="center">
<Col class="table-tool-item" :span="16" style="text-align: left">
<slot name="tool" :size="size" />
</Col>
<Col class="table-tool-item" :span="8" style="text-align: right">
<slot name="tool-right" :size="size" />
</Col>
</Row>
<Table
ref="tableRef"
v-bind="$attrs"
:row-key="rowKey as string"
:loading="loading as boolean"
:size="size as sizeType"
:data="list"
:pagination="hidePage ? false : pagination"
:bordered="false"
:table-layout-fixed="true"
@page-change="onPageChange"
@page-size-change="onSizeChange"
@sorter-change="(dataIndex:string, direction:string) => $emit('rowSort', dataIndex, formatSortType(direction))"
>
<template #columns>
<slot />
</template>
</Table>
</template>
<style lang="less" scoped>
:deep(.arco-table-cell) {
padding: 5px 8px !important;
:hover {
cursor: v-bind(hoverType);
}
& > .arco-table-td-content .arco-btn-size-small {
padding: 5px !important;
}
}
:deep(.table-tool-item) {
> * {
margin-bottom: 12px !important;
}
}
</style>