|
|
@@ -72,10 +72,40 @@ export const useLoadMoreInfinite = <T>(getKey, fetcher, params = {}) => {
|
|
|
// 原分页数据二维数组
|
|
|
const pages = data
|
|
|
const pageIndex = size
|
|
|
+ // 在 useLoadMoreInfinite 中计算 hasMore
|
|
|
+ // 在 useLoadMoreInfinite 中
|
|
|
+ const hasMore = () => {
|
|
|
+ if (!data || data.length === 0) return false; // 无数据,无下一页
|
|
|
|
|
|
+ const lastPage = data[data.length - 1];
|
|
|
+ const totalItems = lastPage.totalCount; // 总数据条数(后端返回)
|
|
|
+ const loadedItemsCount = list.length; // 已加载的总数据条数(扁平化后)
|
|
|
+ const currentPageIndex = lastPage.pageIndex; // 当前最后一页的页码
|
|
|
+ const totalPages = totalItems ? Math.ceil(totalItems / (lastPage.pageSize || 10)) : undefined; // 总页数(计算得出)
|
|
|
+
|
|
|
+ // 分两种场景判断:
|
|
|
+ // 1. 后端返回 totalCount(已知总条数):
|
|
|
+ // - 已加载条数 < 总条数 → 可能有下一页
|
|
|
+ // - 且(有 nextId 或 当前页码 < 总页数)→ 确保有分页依据
|
|
|
+ const hasMoreWhenTotalKnown = totalItems
|
|
|
+ ? (loadedItemsCount < totalItems) && (!!lastPage.nextId || (currentPageIndex && totalPages && currentPageIndex < totalPages))
|
|
|
+ : false;
|
|
|
+
|
|
|
+ // 2. 后端不返回 totalCount(只靠 nextId 分页):
|
|
|
+ // - 只要最后一页有 nextId → 有下一页
|
|
|
+ const hasMoreWhenTotalUnknown = !totalItems && !!lastPage.nextId;
|
|
|
+
|
|
|
+ // 合并两种场景(满足任一即可)
|
|
|
+ return hasMoreWhenTotalKnown || hasMoreWhenTotalUnknown;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 改造 loadMore,添加判断
|
|
|
const loadMore = () => {
|
|
|
- setSize((size) => size + 1);
|
|
|
- }
|
|
|
+ if (hasMore() && !isLoading) { // 避免同时触发多个加载
|
|
|
+ setSize(prev => prev + 1);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
// 重置并重新加载第一页
|
|
|
const resetAndLoadFirstPage = async () => {
|
|
|
// 使用mutate重置数据
|