Skip to content

Commit ad5f079

Browse files
committed
feat: useInfiniteScroll 无限滚动加载
1 parent 40f24d1 commit ad5f079

File tree

4 files changed

+77
-3
lines changed

4 files changed

+77
-3
lines changed

packages/hooks/docs/.vitepress/config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ function getHooksSidebar() {
131131
text: '错误重试',
132132
link: '/useRequest/retry/',
133133
},
134+
{
135+
text: '滚动加载、分页加载',
136+
link: '/useRequest/scroll/',
137+
},
134138
{
135139
text: '自定义插件 🌟',
136140
link: '/useRequest/plugin/',

packages/hooks/src/useInfiniteScroll/index.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,65 @@ useInfiniteScroll 的第一个参数 `service` 是一个异步函数,对这个
7575
title="mutate 数据突变"
7676
desc="">
7777
</demo>
78+
79+
## API
80+
81+
```ts
82+
export type Data = { list: any[];[key: string]: any; };
83+
export type Service<TData extends Data> = (currentData?: TData) => Promise<TData>;
84+
85+
const {
86+
data: Ref<TData>;
87+
loading: ComputedRef<boolean>;
88+
loadingMore: Ref<boolean>;
89+
noMore: ComputedRef<boolean>;
90+
loadMore: () => void;
91+
loadMoreAsync: () => Promise<TData>;
92+
reload: () => void;
93+
reloadAsync: () => Promise<TData>;
94+
cancel: () => void;
95+
mutate: (data?: TData) => void;
96+
} = useInfiniteScroll<TData extends Data>(
97+
service: (currentData?: TData) => Promise<TData>,
98+
{
99+
target?: BasicTarget;
100+
isNoMore?: (data?: TData) => boolean;
101+
threshold?: number;
102+
manual?: boolean;
103+
reloadDeps?: DependencyList;
104+
onBefore?: () => void;
105+
onSuccess?: (data: TData) => void;
106+
onError?: (e: Error) => void;
107+
onFinally?: (data?: TData, e?: Error) => void;
108+
}
109+
);
110+
```
111+
112+
### Result
113+
114+
| 参数 | 说明 | 类型 |
115+
| ------------- | -------------------------------------------------------------------------- | ------------------------ |
116+
| data | service 返回的数据,其中的 `list` 属性为聚合后数据 | `Ref<TData>` \| `undefined` |
117+
| loading | 是否正在进行首次请求 | `ComputedRef<boolean>` |
118+
| loadingMore | 是否正在进行更多数据请求 | `Ref<boolean>` |
119+
| noMore | 是否没有更多数据了,配置 `options.isNoMore` 后生效 | ` ComputedRef<boolean>` |
120+
| loadMore | 加载更多数据,会自动捕获异常,通过 `options.onError` 处理 | `() => void` |
121+
| loadMoreAsync | 加载更多数据,与 `loadMore` 行为一致,但返回的是 Promise,需要自行处理异常 | `() => Promise<TData>` |
122+
| reload | 加载第一页数据,会自动捕获异常,通过 `options.onError` 处理 | `() => void` |
123+
| reloadAsync | 加载第一页数据,与 `reload` 行为一致,但返回的是 Promise,需要自行处理异常 | `() => Promise<TData>` |
124+
| mutate | 直接修改 `data` | `(data?: TData) => void` |
125+
| cancel | 忽略当前 Promise 的响应 | `() => void` |
126+
127+
### Options
128+
129+
| 参数 | 说明 | 类型 | 默认值 |
130+
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | ------- |
131+
| target | 父级容器,如果存在,则在滚动到底部时,自动触发 `loadMore`。需要配合 `isNoMore` 使用,以便知道什么时候到最后一页了。 | `() => Element` \| `Element` \| `MutableRefObject<Element>` | - |
132+
| isNoMore | 是否有最后一页的判断逻辑,入参为当前聚合后的 `data` | `(data?: TData) => boolean` | - |
133+
| threshold | 下拉自动加载,距离底部距离阈值 | `number` | `100` |
134+
| reloadDeps | 变化后,会自动触发 `reload` | `WatchSource` \| `any[]` \|` any` | - |
135+
| manual | <ul><li> 默认 `false`。 即在初始化时自动执行 service。</li><li>如果设置为 `true`,则需要手动调用 `reload``reloadAsync` 触发执行。 </li></ul> | `boolean` | `false` |
136+
| onBefore | service 执行前触发 | `() => void` | - |
137+
| onSuccess | service resolve 时触发 | `(data: TData) => void` | - |
138+
| onError | service reject 时触发 | `(e: Error) => void` | - |
139+
| onFinally | service 执行完成时触发 | `(data?: TData, e?: Error) => void` | - |

packages/hooks/src/useInfiniteScroll/index.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const useInfiniteScroll = <TData extends Data>(
3434
return isNoMore(finalData.value);
3535
});
3636

37-
const { loading, run, runAsync,params, cancel } = useRequest(
37+
const { loading, run, runAsync, cancel } = useRequest(
3838
async (lastData?: TData) => {
3939
const currentData = await service(lastData);
4040

@@ -119,8 +119,7 @@ const useInfiniteScroll = <TData extends Data>(
119119
loading: _loading,
120120
loadingMore,
121121
noMore,
122-
run,
123-
params,
122+
124123
loadMore: loadMore,
125124
loadMoreAsync: loadMoreAsync,
126125
reload: reload,
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
map:
3+
# 映射到docs的路径
4+
path: /useRequest/scroll/
5+
---
6+
7+
# 见👇 useInfiniteScroll
8+
9+
<a href="/useInfiniteScroll/" >滚动加载和分页加载</a>

0 commit comments

Comments
 (0)