Skip to content

刷新与分页 ​

Promise 自动结束 ​

默认是非受控模式。只需返回请求 Promise:

tsx
<SmartRefreshLayout
  hasMore={hasMore}
  onRefresh={async () => {
    const page = await api.firstPage();
    setRows(page.rows);
    setHasMore(page.hasMore);
  }}
  onLoadMore={async () => {
    const page = await api.nextPage();
    setRows((rows) => [...rows, ...page.rows]);
    setHasMore(page.hasMore);
    return { hasMore: page.hasMore };
  }}
>
  <FlatList {...listProps} />
</SmartRefreshLayout>

Promise 成功或失败后都会结束动画。失败时还会调用 onRefreshError 或 onLoadMoreError。

受控状态 ​

传入 refreshing 或 loadingMore 后,对应请求进入受控模式。此时回调完成不会自动收起动画, 调用方必须把值恢复为 false:

tsx
<SmartRefreshLayout
  refreshing={refreshing}
  onRefresh={async () => {
    setRefreshing(true);
    try {
      await reload();
    } finally {
      setRefreshing(false);
    }
  }}
>
  <FlatList {...listProps} />
</SmartRefreshLayout>

同一实例只允许一个请求 ​

刷新与分页共享一个实例锁。请求开始时回调会收到:

ts
interface RefreshRequest {
  requestId: number;
  source: 'gesture' | 'programmatic';
}

请求进行期间的重复手势、刷新与分页交叉触发都会被拒绝。延迟结束命令也只会结束匹配的请求, 不会把更新的请求提前收起。

两种加载模式 ​

loadMoreMode="pull" 是默认值,用户必须上拉并释放才触发分页。

loadMoreMode="auto" 只有在内容超过一屏且检测到真实向上滚动后才会解锁。首次挂载、短列表或 footer 仅仅出现都不会触发。一次请求完成后,需要下一次向上滚动才会再次解锁。

避免重复分页

不要同时启用自动加载和 FlatList.onEndReached,否则两个入口可能发起重复请求。

实例命令 ​

tsx
const ref = useRef<SmartRefreshLayoutRef>(null);

ref.current?.beginRefresh(150);
ref.current?.finishRefresh({ success: true, delay: 200 });
ref.current?.beginLoadMore();
ref.current?.finishLoadMore({ success: true, hasMore: false });
ref.current?.resetNoMoreData();

beginRefresh 与 beginLoadMore 返回的是命令是否被接受,不代表网络请求已经完成。

Released under the MIT License.