Explorar o código

fix: 加载更多是否有更多数据判断错误

王晓东 hai 3 semanas
pai
achega
f0edc374a9
Modificáronse 1 ficheiros con 32 adicións e 2 borrados
  1. 32 2
      src/utils/loadMoreInfinite.ts

+ 32 - 2
src/utils/loadMoreInfinite.ts

@@ -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重置数据