UNPKG

rc-hooks

Version:
95 lines (94 loc) 4.46 kB
import { AsyncOptions } from '../useAsync'; import { TargetType } from './useScrollToLower'; /** * 加载更多异步返回类型。 */ export interface LoadMoreAsyncReturn<DataItem = any> { /** * @description 列表数据。 */ list: DataItem[]; [key: string]: any; } /** * 异步函数参数类型。 */ export type LoadMoreParams = [ page: { current: number; }, ...args: any[] ]; export interface LoadMoreOptions<DataItem = any, R extends LoadMoreAsyncReturn<DataItem> = any> extends Omit<AsyncOptions<R, LoadMoreParams>, 'cacheKey' | 'cacheTime' | 'persisted' | 'pollingInterval' | 'pollingWhenHidden'> { /** * @description 上拉自动加载,距离底部距离阈值。 * @default 100 */ threshold?: number; /** * @description 内容的滚动容器。如果存在,则在滚动到底部时,自动触发 `loadMore` 方法。 */ target?: TargetType; /** * @description 判断是否没有更多数据。 * @param data 异步返回的数据。 * @returns * @default () => false */ isNoMore?: (data?: R) => boolean; } /** * 基于 `useAsync` 扩展,用于管理加载更多的 Hook。 * * @param {number} [options.threshold=100] 上拉自动加载,距离底部距离阈值。默认 `100`。 * @param {Object | Function} [options.target] 内容的滚动容器,如果存在,则在滚动到底部时,自动触发 `loadMore` 方法。 * @param {Function} [options.isNoMore=()=>false] 判断是否没有更多数据。默认 `()=>false`。 * @param {boolean} [options.autoRun=true] 在初始化时自动执行异步函数。如果设置为 `false`,则需要手动调用 `run` 触发执行。默认 `true`。 * @param {*} [options.initialData] 初始化的 `data`。 * @param {boolean} [options.defaultLoading] 初始化默认 `loading` 值。默认值等于 `autoRun && !loadingDelay`。 * @param {Array} [options.defaultParams] 如果 `autoRun=true` 自动执行 `run` 的默认参数。 * @param {Array} [options.refreshDeps] 在 `autoRun = true` 时,refreshDeps 变化,会执行 `refresh` (重置`current`到第 1 页,并清除之前列表数据,发起请求。)。 * @param {Function} [options.onBefore] 异步函数执行前触发,参数为 `params`。 * @param {Function} [options.onSuccess] 异步函数 `resolve` 时触发,参数为 `data` 和 `params`。 * @param {Function} [options.onError] 异步函数报错时触发,参数为 `error` 和 `params`。 * @param {number} [options.loadingDelay] 设置 `loading` 延迟时间,避免闪烁,单位为毫秒。 * @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, loadingMore, noMore, loadMore, refresh, cancel } = useLoadMore(asyncFn, options); */ declare function useLoadMore<DataItem = any, R extends LoadMoreAsyncReturn<DataItem> = any>(asyncFn: (...args: LoadMoreParams) => Promise<R>, options?: LoadMoreOptions<R>): { loading: boolean; data: R | undefined; run: (page: { current: number; }, ...args: any[]) => Promise<R>; /** * 重置`current`到第 `1` 页,并清除之前列表数据,发起请求。 */ refresh: () => Promise<R>; cancel: () => void; mutate: (newData: R | ((oldData: R) => R) | undefined) => void; params: { current: number; }[]; /** * 触发加载更多。 * * 如果没有更多或者正在加载中,返回 `undefined`。 */ loadMore: () => Promise<R | undefined>; /** * 是否正在加载更多。即加载中并且 `current` 不等于 `1`。 */ loadingMore: boolean; /** * 是否没有更多。 */ noMore: boolean; error: null | Error; }; export default useLoadMore;