import { nextTick, ref } from "vue"; import { getDataType } from "@/assets/js/utils.js"; /** * @param api {Function} 接口函数 * @param options {Object?: {callbackFn, otherParams, immediate, usePagination}} 配置项 * @param options.callbackFn {Function?} 回调函数 * @param options.otherParams {Object?} 其它接口参数 * @param options.immediate {Boolean?} 是否立即执行接口函数(默认是) * @param options.usePagination {Boolean?} 是否使用分页(默认是) * @return {Object} 返回对象包含以下属性:list 表格数据,pagination 分页数据,searchForm 搜索表单数据,tableRef 表格实例,fnGetData 获取数据函数,fnResetPagination 重置分页函数 */ export default function useListData(api, options = {}) { if (getDataType(api) !== "Function") throw new Error("api必须是一个函数"); if (getDataType(options) !== "Object") throw new Error("options必须是一个对象"); if (options.immediate && getDataType(options.immediate) !== "Boolean") throw new Error("options.immediate必须是一个布尔值"); if (options.usePagination && getDataType(options.usePagination) !== "Boolean") throw new Error("options.usePagination必须是一个布尔值"); const immediate = options.immediate ?? true; const usePagination = options.usePagination ?? true; if (!immediate && options.otherParams) throw new Error("options.otherParams只有在immediate为true时才有效"); if ( immediate && options.otherParams && getDataType(options.otherParams) !== "Object" ) throw new Error("options.otherParams必须是一个对象"); if (options.callbackFn && getDataType(options.callbackFn) !== "Function") throw new Error("options.callbackFn必须是一个函数"); const list = ref([]); const pagination = ref({ currentPage: 1, pageSize: 10, total: 0, }); const searchForm = ref({}); const tableRef = ref(null); const fnGetData = async (otherParams = {}) => { const resData = await api({ ...(usePagination ? { currentPage: pagination.value.currentPage, showCount: pagination.value.pageSize, } : {}), ...searchForm.value, ...(options.otherParams || {}), ...(getDataType(otherParams) === "Object" ? otherParams : {}), }); list.value = resData.varList; pagination.value.total = resData.page.totalResult; options.callbackFn && options.callbackFn(list.value); }; immediate && fnGetData().then(); const fnResetPagination = async (otherParams) => { list.value = []; pagination.value = { currentPage: 1, pageSize: 10, total: 0, }; await nextTick(); await fnGetData(otherParams); tableRef.value && tableRef.value.clearSelection(); }; return { list, pagination, searchForm, tableRef, fnGetData: async (otherParams) => await fnGetData(otherParams), fnResetPagination: async (otherParams) => await fnResetPagination(otherParams), }; }