12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import { ref, reactive, watch } from 'vue';
- // options参数示例:
- // {
- // pageSize: 20,
- // params: ref({ a: 1, b: 2 }),
- // fetchDataHandle: () => {},
- // }
- export default function useFetchTable(apiFn, options = {}, immediately = true) {
- let pagination = reactive({
- page: 1,
- pageSize: options?.pageSize || 10,
- total: 0,
- });
- //tdesign的分页器组件的onChange方法,涵盖了页码的change和pageSize的change 两者的监听
- const onChange = (pageInfo) => {
- pagination.Size = pageInfo.pageSize;
- pagination.page = pageInfo.current;
- };
- const onPageSizeChange = (size) => {
- pagination.pageSize = size;
- pagination.page = 1;
- };
- const loading = ref(false);
- const tableData = ref([]);
- const fetchData = async () => {
- loading.value = true;
- try {
- let params = {
- pageNumber: pagination.page,
- pageSize: pagination.pageSize,
- ...(options.params?.value || {}),
- };
- let res = await apiFn(params);
- //下方代码 后续根据实际接口返回字段进行修改
- let list = Array.isArray(res.records) ? res.records : [];
- tableData.value = list;
- pagination.total = res.total;
- loading.value = false;
- options.fetchDataHandle && options.fetchDataHandle();
- } catch (err) {
- console.warn('分页请求错误:', err);
- }
- };
- const search = () => {
- if (pagination.page === 1) {
- fetchData();
- } else {
- pagination.page = 1;
- }
- };
- if (immediately) {
- //默认立即执行一次分页请求,如果不想如此,可以将第三个参数immediately传false
- fetchData();
- }
- watch(
- () => pagination.page,
- () => {
- fetchData();
- }
- );
- return {
- loading,
- pagination,
- tableData,
- fetchData,
- search,
- onChange,
- onPageSizeChange,
- };
- }
|