forked from integrated_whb/integrated_whb_vue
				
			
		
			
				
	
	
		
			104 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
import { nextTick, ref } from "vue";
 | 
						||
import { getDataType } from "@/assets/js/utils.js";
 | 
						||
 | 
						||
/**
 | 
						||
 * @param api {Function} 接口函数
 | 
						||
 * @param options {Object?: {callbackFn, otherParams, defaultSearchForm, immediate, usePagination, key}} 配置项
 | 
						||
 * @param options.callbackFn {Function?} 回调函数(返回值【第一个参数表格数据,第二个参数后台返回的所有数据】)
 | 
						||
 * @param options.otherParams {Object?} 其它接口参数
 | 
						||
 * @param options.defaultSearchForm {Object?} searchForm默认值
 | 
						||
 * @param options.immediate {Boolean?} 是否立即执行接口函数(默认是)
 | 
						||
 * @param options.usePagination {Boolean?} 是否使用分页(默认是)
 | 
						||
 * @param options.clearSelection {Boolean?} 调用fnResetPagination是是否清空表格选择数据(默认是)
 | 
						||
 * @param options.key {String?} 返回的存放数组的key(默认varList)
 | 
						||
 * @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必须是一个布尔值");
 | 
						||
  if (options.key && getDataType(options.key) !== "String")
 | 
						||
    throw new Error("options.key必须是一个字符串");
 | 
						||
  if (
 | 
						||
    options.callbackFn &&
 | 
						||
    getDataType(options.callbackFn) !== "Function" &&
 | 
						||
    getDataType(options.callbackFn) !== "AsyncFunction"
 | 
						||
  )
 | 
						||
    throw new Error("options.callbackFn必须是一个函数");
 | 
						||
  if (
 | 
						||
    options.defaultSearchForm &&
 | 
						||
    getDataType(options.defaultSearchForm) !== "Object"
 | 
						||
  )
 | 
						||
    throw new Error("options.defaultSearchForm必须是一个对象");
 | 
						||
  if (
 | 
						||
    options.clearSelection &&
 | 
						||
    getDataType(options.clearSelection) !== "Boolean"
 | 
						||
  )
 | 
						||
    throw new Error("options.clearSelection必须是一个布尔值");
 | 
						||
  const immediate = options.immediate ?? true;
 | 
						||
  const usePagination = options.usePagination ?? true;
 | 
						||
  const key = options.key ?? "varList";
 | 
						||
  const defaultSearchForm = options.defaultSearchForm ?? {};
 | 
						||
  const clearSelection = options.clearSelection ?? true;
 | 
						||
  if (
 | 
						||
    immediate &&
 | 
						||
    options.otherParams &&
 | 
						||
    getDataType(options.otherParams) !== "Object"
 | 
						||
  )
 | 
						||
    throw new Error("options.otherParams必须是一个对象");
 | 
						||
  const list = ref([]);
 | 
						||
  const pagination = ref({
 | 
						||
    currentPage: 1,
 | 
						||
    pageSize: 10,
 | 
						||
    total: 0,
 | 
						||
  });
 | 
						||
  const searchForm = ref(defaultSearchForm);
 | 
						||
  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[key];
 | 
						||
    if (usePagination) pagination.value.total = resData.page.totalResult;
 | 
						||
    options.callbackFn && options.callbackFn(list.value, resData);
 | 
						||
    !usePagination &&
 | 
						||
      clearSelection &&
 | 
						||
      tableRef.value &&
 | 
						||
      tableRef.value.clearSelection();
 | 
						||
  };
 | 
						||
  immediate && fnGetData().then();
 | 
						||
  const fnResetPagination = async (otherParams) => {
 | 
						||
    list.value = [];
 | 
						||
    pagination.value = {
 | 
						||
      currentPage: 1,
 | 
						||
      pageSize: 10,
 | 
						||
      total: 0,
 | 
						||
    };
 | 
						||
    await nextTick();
 | 
						||
    await fnGetData(otherParams);
 | 
						||
    clearSelection && tableRef.value && tableRef.value.clearSelection();
 | 
						||
  };
 | 
						||
  return {
 | 
						||
    list,
 | 
						||
    pagination,
 | 
						||
    searchForm,
 | 
						||
    tableRef,
 | 
						||
    fnGetData: async (otherParams) => await fnGetData(otherParams),
 | 
						||
    fnResetPagination: async (otherParams) =>
 | 
						||
      await fnResetPagination(otherParams),
 | 
						||
  };
 | 
						||
}
 |