Files
xl-mobile/src/hooks/useTableQuery.js
2025-05-13 10:45:51 +08:00

91 lines
1.9 KiB
JavaScript

import {reactive, ref, watch} from 'vue';
/**
*
* @param parameter
* @param api
* @param callback
* @param immediate
* @param watchParameter
*/
function useTableQuery({
parameter,
api,
callback,
immediate = true,
watchParameter = false,
}) {
const loading = ref(false);
const vo = reactive({
rows: [],
page: 0,
total: 0,
});
const pagination = reactive({
page: 1,
pageSize: 9,
total: 0
});
const fetchData = async () => {
try {
loading.value = true;
const params = {
...parameter,
page: pagination.page,
pageSize: pagination.pageSize
}
const {data} = await api(params);
pagination.pageSize = data.page;
pagination.total = data.total;
const _vo = {
...data,
rows: data.list.map(v => ({...v, key: v.id})),
};
vo.page = _vo.page;
vo.total = _vo.total;
vo.rows = [...vo.rows, ..._vo.rows];
callback && callback(vo);
} finally {
loading.value = false;
}
}
const initFetchData = async () => {
pagination.page = 1;
pagination.total = 0;
vo.page = 0;
vo.total = 0;
vo.rows.length = 0;
await fetchData();
}
watch(
() => [pagination.page, pagination.pageSize],
() => fetchData(),
{deep: true, immediate: immediate}
)
if (watchParameter) watch(
() => parameter,
() => fetchData(),
{deep: true}
);
return {
loading,
pagination,
fetchData,
initFetchData,
}
}
export default useTableQuery;