perf(hooks): perf useHookTable

This commit is contained in:
Soybean 2023-07-26 00:49:55 +08:00
parent b3ae7605d3
commit 809fa85706
3 changed files with 16 additions and 139 deletions

View File

@ -43,12 +43,17 @@ type ApiParamsUpdater<P, R> = (params: P) => R;
*/
type PagePropsOfPagination = Pick<PaginationProps, 'page' | 'pageSize'>;
/**
* key
*/
type CustomColumnKey<K = never> = K | 'action';
/**
*
*/
type HookTableColumn<T = Record<string, unknown>> =
| (Omit<TableColumnGroup<T>, 'key'> & { key: keyof T })
| (Omit<DataTableBaseColumn<T>, 'key'> & { key: keyof T })
| (Omit<TableColumnGroup<T>, 'key'> & { key: CustomColumnKey<keyof T> })
| (Omit<DataTableBaseColumn<T>, 'key'> & { key: CustomColumnKey<keyof T> })
| DataTableSelectionColumn<T>
| DataTableExpandColumn<T>;
@ -67,7 +72,7 @@ type HookTableConfig<TableData, Fn extends ApiFn> = {
/**
*
*/
columns: HookTableColumn<TableData>[];
columns: () => HookTableColumn<TableData>[];
/**
*
* @description , `page` `pageSize`,
@ -101,7 +106,7 @@ export default function useHookTable<TableData, Fn extends ApiFn>(apiFn: Fn, con
data.value = update;
}
const columns = ref(config.columns) as Ref<HookTableColumn<TableData>[]>;
const columns = ref(config.columns()) as Ref<HookTableColumn<TableData>[]>;
const requestParams = ref(apiParams) as Ref<HookTableConfig<TableData, Fn>['apiParams']>;
@ -154,6 +159,10 @@ export default function useHookTable<TableData, Fn extends ApiFn>(apiFn: Fn, con
endLoading();
}
function reloadColumns() {
columns.value = config.columns();
}
if (immediate) {
getData();
}
@ -165,6 +174,7 @@ export default function useHookTable<TableData, Fn extends ApiFn>(apiFn: Fn, con
empty,
pagination,
getData,
updatePagination
updatePagination,
reloadColumns
};
}

View File

@ -1,133 +0,0 @@
import { ref, reactive } from 'vue';
import type { Ref } from 'vue';
import type { DataTableBaseColumn, DataTableSelectionColumn, DataTableExpandColumn, PaginationProps } from 'naive-ui';
import type { TableColumnGroup, InternalRowData } from 'naive-ui/es/data-table/src/interface';
import { useLoadingEmpty } from '../common';
/**
*
*/
type PaginationParams = Pick<PaginationProps, 'page' | 'pageSize'>;
/**
*
*/
type ApiParams<TableData> = Record<string, unknown> & PaginationParams & Partial<TableData>;
/**
*
* @description list来表示后端接口返回的表格数据
*/
type ApiData<TableData = Record<string, unknown>> = Record<string, unknown> & { list: TableData[] };
/**
*
*/
type ApiFn<TableData = Record<string, unknown>, Params = ApiParams<TableData>> = (
params: Params
) => Promise<Service.RequestResult<ApiData<TableData>>>;
/**
*
*/
type TransformedTableData<TableData = Record<string, unknown>> = {
data: TableData[];
pageNum: number;
pageSize: number;
total: number;
};
/**
*
*/
type DataTableColumn<T = InternalRowData> =
| (Omit<TableColumnGroup<T>, 'key'> & { key: keyof T })
| (Omit<DataTableBaseColumn<T>, 'key'> & { key: keyof T })
| DataTableSelectionColumn<T>
| DataTableExpandColumn<T>;
/**
*
* @description
*/
type Transformer<TableData = Record<string, unknown>> = (
apiData: ApiData<TableData>
) => TransformedTableData<TableData>;
type TableParams<TableData = Record<string, unknown>, Params = ApiParams<TableData>> = {
apiFn: ApiFn<TableData, Params>;
apiParams: Params;
columns: DataTableColumn<TableData>[];
transformer: Transformer<TableData>;
pagination?: PaginationProps;
};
export function useTable<TableData extends Record<string, unknown>, Params extends ApiParams<TableData>>(
params: TableParams<TableData, Params>,
immediate = true
) {
const { loading, startLoading, endLoading, empty, setEmpty } = useLoadingEmpty();
const data: Ref<TableData[]> = ref([]);
function updateData(update: TableData[]) {
data.value = update;
}
const columns = ref(params.columns) as Ref<DataTableColumn<TableData>[]>;
const pagination = reactive({
page: 1,
pageSize: 10,
showSizePicker: true,
pageSizes: [10, 15, 20, 25, 30],
onChange: (page: number) => {
pagination.page = page;
},
onUpdatePageSize: (pageSize: number) => {
pagination.pageSize = pageSize;
pagination.page = 1;
},
...params.pagination
}) as PaginationProps;
function updatePagination(update: Partial<PaginationProps>) {
Object.assign(pagination, update);
}
async function getData() {
const apiParams: Params = { ...params.apiParams };
apiParams.page = apiParams.page || pagination.page;
apiParams.pageSize = apiParams.pageSize || pagination.pageSize;
startLoading();
const { data: apiData } = await params.apiFn(apiParams);
if (apiData) {
const transformedData = params.transformer(apiData);
updateData(transformedData.data);
setEmpty(transformedData.data.length === 0);
updatePagination({ page: transformedData.pageNum, pageSize: transformedData.pageSize });
}
endLoading();
}
if (immediate) {
getData();
}
return {
data,
columns,
loading,
empty,
pagination,
getData,
updatePagination
};
}

View File

@ -18,6 +18,6 @@ declare namespace StorageInterface {
/** 多页签路由信息 */
multiTabRoutes: App.GlobalTabRoute[];
/** 本地语言缓存 */
lang: I18nType.langType;
lang: I18nType.LangType;
}
}