| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { ref, reactive, watchEffect, unref } from "vue"; |
| | | import useFormData from "@/hooks/useFormData"; |
| | | import { deepClone, isEqual } from "@/utils/index.js" |
| | | import { ElMessage } from 'element-plus' |
| | | |
| | | /** |
| | | * å页api |
| | | * @param api æ¥å£ |
| | | * @param initalFilters åå§åç鿡件 |
| | | * @param sorters |
| | | * @param filterTransformer |
| | | */ |
| | | export function usePaginationApi( |
| | | api, |
| | | initalFilters, |
| | | columns, |
| | | sorters, |
| | | filterTransformer, |
| | | cb |
| | | ) { |
| | | const dataList = ref([]); |
| | | const { form: filters, resetForm } = useFormData(initalFilters); |
| | | let lastFilters = deepClone(initalFilters); |
| | | const sorter = reactive(sorters || {}); |
| | | const others = ref({}); |
| | | const loading = ref(true); |
| | | const paginationAlign = ref("right"); |
| | | |
| | | /** å页é
ç½® */ |
| | | const pagination = reactive({ |
| | | pageSize: 100, |
| | | currentPage: 1, |
| | | pageSizes: [10, 15, 20], |
| | | total: 0, |
| | | align: "right", |
| | | background: true |
| | | }); |
| | | |
| | | /** å è½½å¨ç»é
ç½® */ |
| | | const loadingConfig = reactive({ |
| | | text: "æ£å¨å 载第ä¸é¡µ...", |
| | | viewBox: "-10, -10, 50, 50", |
| | | spinner: ` |
| | | <path class="path" d=" |
| | | M 30 15 |
| | | L 28 17 |
| | | M 25.61 25.61 |
| | | A 15 15, 0, 0, 1, 15 30 |
| | | A 15 15, 0, 1, 1, 27.99 7.5 |
| | | L 15 15 |
| | | " style="stroke-width: 4px; fill: rgba(0, 0, 0, 0)"/> |
| | | ` |
| | | // svg: "", |
| | | // background: rgba() |
| | | }); |
| | | |
| | | function getFinalParams() { |
| | | const finalFilters = {}; |
| | | const beforeParams = unref(filters); |
| | | if (filterTransformer) { |
| | | Object.keys(beforeParams).forEach(key => { |
| | | if (filterTransformer[key]) { |
| | | Object.assign( |
| | | finalFilters, |
| | | filterTransformer[key](beforeParams[key], beforeParams) |
| | | ); |
| | | } else { |
| | | finalFilters[key] = beforeParams[key]; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | return filterTransformer |
| | | ? { ...finalFilters, ...sorter } |
| | | : { ...beforeParams, ...sorter }; |
| | | } |
| | | |
| | | async function getTableData() { |
| | | // å¦æè¿æ¬¡å䏿¬¡çfilterä¸åï¼é£ä¹å°±é置页ç |
| | | if (!isEqual(unref(filters), lastFilters)) { |
| | | pagination.currentPage = 1; |
| | | lastFilters = deepClone(unref(filters)); |
| | | } |
| | | loading.value = true; |
| | | api({ |
| | | ...getFinalParams(), |
| | | current: pagination.currentPage, |
| | | size: pagination.pageSize |
| | | }).then(({ code, data, msg, ...rest }) => { |
| | | if (code == 200) { |
| | | // pagination.currentPage = meta.current_page; |
| | | // pagination.pageSize = meta.per_page; |
| | | pagination.total = data.total; |
| | | others.value = rest; |
| | | dataList.value = data.records; |
| | | cb && cb(data); |
| | | loading.value = false; |
| | | } else { |
| | | loading.value = false; |
| | | ElMessage({ message: msg, type: "error" }); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | function onSizeChange(val) { |
| | | pagination.pageSize = val; |
| | | pagination.currentPage = 1; |
| | | getTableData(); |
| | | } |
| | | |
| | | function onCurrentChange(val) { |
| | | loadingConfig.text = `æ£å¨å 载第${val}页...`; |
| | | loading.value = true; |
| | | getTableData(); |
| | | } |
| | | function resetFilters() { |
| | | resetForm(); |
| | | pagination.currentPage = 1; |
| | | getTableData(); |
| | | } |
| | | |
| | | watchEffect(() => { |
| | | pagination.align = paginationAlign.value |
| | | }); |
| | | |
| | | // onMounted(() => { |
| | | // getTableData(); |
| | | // }); |
| | | |
| | | return { |
| | | loading, |
| | | columns, |
| | | dataList, |
| | | pagination, |
| | | loadingConfig, |
| | | paginationAlign, |
| | | filters, |
| | | sorter, |
| | | others, |
| | | onSizeChange, |
| | | onCurrentChange, |
| | | getTableData, |
| | | resetFilters |
| | | }; |
| | | } |