integrated_traffic_vue/src/assets/js/useListData.js

80 lines
3.0 KiB
JavaScript
Raw Normal View History

2024-01-04 09:02:38 +08:00
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必须是一个函数");
2024-01-05 14:32:49 +08:00
if (getDataType(options) !== "Object")
throw new Error("options必须是一个对象");
2024-01-04 09:02:38 +08:00
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),
};
}