rc-hooks
Version:
React Hooks Library.
94 lines (93 loc) • 4.86 kB
TypeScript
import { AsyncOptions } from '../useAsync';
/**
* 分页异步返回类型。
*/
export interface PaginationAsyncReturn<DataItem = any> {
list: DataItem[];
total: number;
[key: string]: any;
}
/**
* 异步函数参数类型。
*/
export type PaginationParams = [
param1: {
current: number;
pageSize: number;
[key: string]: any;
},
...args: any[]
];
export interface PaginationOptions<DataItem = any, R extends PaginationAsyncReturn<DataItem> = any> extends AsyncOptions<R, PaginationParams> {
defaultPageSize?: number;
}
/**
* 基于 `useAsync` 扩展,用于管理分页的 Hook。
*
* @param {Function} asyncFn 异步函数。
* @param {Object} [options] 配置项。
* @param {number} [options.defaultPageSize=10] 默认每页的数量。
* @param {boolean} [options.autoRun=true] 在初始化时自动执行异步函数。如果设置为 `false`,则需要手动调用 `run` 触发执行。默认 `true`。
* @param {*} [options.initialData] 初始化的 `data`。
* @param {boolean} [options.defaultLoading=false] 初始化默认 `loading` 值。默认值等于 `autoRun && !loadingDelay`。
* @param {Array} [options.defaultParams] 如果 `autoRun=true` 自动执行 `run` 的默认参数。
* @param {Array} [options.refreshDeps] 在 `autoRun = true` 时,refreshDeps 变化,会重置 `current` 到第一页,并执行 `run` 方法。
* @param {Function} [options.onBefore] 异步函数执行前触发,参数为 `params`。
* @param {Function} [options.onSuccess] 异步函数 `resolve` 时触发,参数为 `data` 和 `params`。
* @param {Function} [options.onError] 异步函数报错时触发,参数为 `error` 和 `params`。
* @param {string} [options.cacheKey] 缓存的键值。启用缓存机制,异步成功结果将被缓存。如果多个相同 cacheKey 的异步同时触发中,将共享第一个异步结果。
* @param {number} [options.cacheTime=5*60*1000] 缓存时间。单位毫秒。
* @param {boolean} [options.persisted=false] 持久化数据。当有缓存数据时,不再执行异步函数。需要配合 `cacheKey` `cacheTime` 使用。默认 `false`。
* @param {number} [options.loadingDelay] 设置 `loading` 延迟时间,避免闪烁,单位为毫秒。
* @param {number} [options.pollingInterval] 轮询间隔,单位为毫秒。设置后,将进入轮询模式,定时触发 `run`。
* @param {boolean} [options.pollingWhenHidden=true] 在页面隐藏时,是否继续轮询。如果为 `true`,不会停止轮询。如果为 `false`,在页面隐藏时会暂时停止轮询,页面重新显示时继续上次轮询。默认 `true`。
* @param {boolean} [options.refreshOnWindowFocus=false] 在屏幕重新获取焦点或重新显示时,是否重新发起请求。如果为 `false`,不会重新发起请求。如果为 `true`,在屏幕重新聚焦或重新显示时,会重新发起请求。默认 `false`。
* @param {number} [options.focusTimespan=5000] 屏幕重新聚焦,重新发起请求时间间隔。需要配置 `refreshOnWindowFocus` 使用。默认 `5000`。
* @param {number} [options.debounceInterval] 防抖间隔,单位为毫秒,设置后,请求进入防抖模式。
* @param {number} [options.throttleInterval] 节流间隔,单位为毫秒,设置后,请求进入节流模式。
* @returns {Object}
* @example
* const { data, error, loading, run, params, refresh, pagination, tableProps } = usePagination(asyncFn, options);
*/
declare function usePagination<D = any, R extends PaginationAsyncReturn<D> = any>(asyncFn: (...args: PaginationParams) => Promise<R>, options?: PaginationOptions<R>): {
data: R | undefined;
run: (param1: {
[key: string]: any;
current: number;
pageSize: number;
}, ...args: any[]) => Promise<R>;
refresh: () => Promise<R>;
loading: boolean;
params: PaginationParams;
/**
* 分页数据及操作分页的方法。
*/
pagination: {
current: number;
pageSize: number;
total: number;
onChange: (c: number, p: number) => void;
changeCurrent: (c: number) => void;
changePageSize: (p: number) => void;
};
/**
* 适配 antd Table 组件的数据结构,可以直接用在 antd Table 组件上。
*/
tableProps: {
dataSource: R["list"];
loading: boolean;
onChange: (pagination: {
current?: number;
pageSize?: number;
} & Record<string, any>, filters: any, sorter: any, extra: any) => void;
pagination: {
total: number;
current: number;
pageSize: number;
};
};
error: null | Error;
cancel: () => void;
mutate: (newData: R | ((oldData: R) => R) | undefined) => void;
};
export default usePagination;