Files
xl-mobile/src/hooks/useTableQuery.js

91 lines
1.9 KiB
JavaScript
Raw Normal View History

2025-04-21 15:19:28 +08:00
import {reactive, ref, watch} from 'vue';
2025-03-27 15:38:21 +08:00
/**
*
* @param parameter
* @param api
* @param callback
* @param immediate
* @param watchParameter
*/
function useTableQuery({
parameter,
api,
callback,
immediate = true,
watchParameter = false,
}) {
const loading = ref(false);
2025-05-12 19:45:27 +08:00
const vo = reactive({
rows: [],
page: 0,
total: 0,
});
2025-03-27 15:38:21 +08:00
const pagination = reactive({
2025-05-12 19:45:27 +08:00
page: 1,
2025-05-13 10:45:51 +08:00
pageSize: 9,
2025-03-27 15:38:21 +08:00
total: 0
});
const fetchData = async () => {
try {
loading.value = true;
const params = {
...parameter,
2025-05-12 19:45:27 +08:00
page: pagination.page,
2025-03-27 15:38:21 +08:00
pageSize: pagination.pageSize
}
const {data} = await api(params);
pagination.pageSize = data.page;
pagination.total = data.total;
2025-05-12 19:45:27 +08:00
const _vo = {
2025-03-27 15:38:21 +08:00
...data,
2025-05-12 19:45:27 +08:00
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);
2025-03-27 15:38:21 +08:00
} finally {
loading.value = false;
}
}
const initFetchData = async () => {
2025-05-12 19:45:27 +08:00
pagination.page = 1;
pagination.total = 0;
vo.page = 0;
vo.total = 0;
vo.rows.length = 0;
await fetchData();
2025-03-27 15:38:21 +08:00
}
watch(
2025-05-12 19:45:27 +08:00
() => [pagination.page, pagination.pageSize],
2025-03-27 15:38:21 +08:00
() => fetchData(),
{deep: true, immediate: immediate}
)
if (watchParameter) watch(
() => parameter,
2025-05-12 19:45:27 +08:00
() => fetchData(),
2025-03-27 15:38:21 +08:00
{deep: true}
);
return {
loading,
pagination,
fetchData,
initFetchData,
}
}
export default useTableQuery;