forked from integrated_whb/integrated_whb_vue
78 lines
2.9 KiB
JavaScript
78 lines
2.9 KiB
JavaScript
|
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 (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),
|
|||
|
};
|
|||
|
}
|