/* * @Author: 田鑫 * @Date: 2023-02-16 15:02:51 * @LastEditors: 田鑫 * @LastEditTime: 2023-03-09 11:20:59 * @Description: table-hooks */ import type { PaginationProps, TableBorder, TableColumnData, TableData, TableRowSelection } from '@arco-design/web-vue'; type Size = 'mini' | 'small' | 'medium' | 'large'; interface IDefaultProps { /** 是否显示边框 */ bordered?: TableBorder; /** 是否显示选中效果 */ hoverable?: boolean; /** 表格的大小 */ size?: Size; /** 是否允许调整列宽 */ 'column-resizable'?: boolean; /** 是否为加载中状态 */ loading?: boolean; /** 分页参数 */ pagination?: PaginationProps; /** table数据类型 */ data?: any[]; /** 表头参数 */ columns?: TableColumnData[]; /** 表格行 key 的取值字段 */ 'row-key'?: string; /** 表格的行选择器配置 */ 'row-selection'?: TableRowSelection; 'selected-keys'?: (string | number)[]; [x: string]: any; } interface IPagination { /** 当前页数 */ current?: number; /** 总页数默认是0条 */ total?: number; } interface ITableResponse { current?: number; records?: T[]; size?: number; total?: number; [x: string]: any; } type GetListFunc = (v: object) => Promise>; export default function useTableProps(loadListFunc: GetListFunc) { const defaultProps: IDefaultProps = { bordered: { cell: true }, size: 'large', 'column-resizable': true, loading: true, data: [] as any[], pagination: { current: 1, pageSize: 20, total: 0, showPageSize: true, showTotal: true, }, hoverable: false, columns: [], }; //* 属性组 const propsRes = reactive(defaultProps); //* 设置请求参数,如果出了分页参数还有搜索参数,在模板页面调用此方法,可以加入参数 const loadListParams = reactive({ page: 1, size: 20, }); /** * 单独设置默认属性 * @param params */ const setProps = (params: IDefaultProps) => { if (Object.keys(params).length > 0) { Object.assign(defaultProps, params); } }; /** * 设置表头数据 * @param columns */ const setColumns = (columns: TableColumnData[]) => { propsRes.columns = columns; }; /** * 设置loading * @param status */ const setLoading = (status: boolean) => { propsRes.loading = status; }; /** * 设置分页 * @param param0 */ const setPagination = ({ current, total }: IPagination) => { propsRes.pagination!.current = current; total && (propsRes.pagination!.total = total); Object.assign(loadListParams, { page: current }); }; /** * 设置列表请求参数 * @param params */ const setLoadListParams = (params?: R) => { Object.assign(loadListParams, params); }; /** * 加载列表 * @returns */ const loadTableData = async (resetPageIndex = false) => { if (resetPageIndex) { setPagination({ current: 1 }); } setLoading(true); try { const resData = await loadListFunc({ ...loadListParams, }); console.log(resData); const response = resData as ITableResponse; propsRes.data = response.records; setPagination({ current: response.current, total: response.total, }); setLoading(false); return resData; } catch (error) { setLoading(false); return []; } }; // 事件触发组 const propsEvent = reactive({ // 排序触发 sorterChange: (dataIndex: string, direction: string) => { console.log(dataIndex, direction); }, // 分页触发 pageChange: (current: number) => { setPagination({ current }); loadTableData(); }, // 修改每页显示条数 pageSizeChange: (size: number) => { propsRes.pagination!.pageSize = size; Object.assign(loadListParams, { size }); loadTableData(); }, selectionChange: (rowKeys: (string | number)[]) => { propsRes['selected-keys'] = rowKeys; }, }); return { propsRes, propsEvent, loadListParams, setProps, setColumns, setLoading, setPagination, loadTableData, setLoadListParams, }; }