useInfiniteScroll

بارگذاری تدریجی با IntersectionObserver — بدون scroll event listener

معرفی

هوک useInfiniteScroll یک sentinelRef ارائه می‌دهد که وقتی المان مرجع وارد viewport می‌شود، تابع onLoadMore را فراخوانی می‌کند. از IntersectionObserver استفاده می‌کند و عملکرد بهینه‌ای نسبت به scroll event دارد.

چه زمانی استفاده کنیم

  • لیست‌های طولانی با pagination (اینفلوئنسرها، پست‌ها، نظرات)
  • جدول‌های داده با بارگذاری تدریجی
  • گالری تصاویر یا کارت‌ها

چه زمانی استفاده نکنیم

  • لیست‌های کوتاه (کمتر از 50 آیتم) — pagination معمولی کافی است
  • وقتی کاربر باید بتواند مستقیماً به صفحه خاصی برود → از Pagination استفاده کنید

استفاده

import { useInfiniteScroll } from '@partodata/ui'
import { Account, EntityCollection } from '@partodata/ui/social'

function InfluencerList() {
  const { data, fetchNextPage, hasNextPage, isFetchingNextPage } = useInfiniteQuery(...)

  const { sentinelRef } = useInfiniteScroll({
    onLoadMore: () => fetchNextPage(),
    hasMore: hasNextPage,
    isLoading: isFetchingNextPage,
  })

  return (
    <EntityCollection
      entity="account"
      items={data.pages.flat()}
      getId={(account) => account.id}
      // صفحهٔ بعد: موردها می‌مانند و اسکلت هم‌شکلشان زیرشان می‌آید
      loadingMore={isFetchingNextPage}
      label="اینفلوئنسرها"
      renderItem={(account, item) => <Account account={account} {...item} />}
      // المان sentinel — وقتی وارد viewport شود، صفحه بعدی بارگذاری می‌شود
      pagination={<div ref={sentinelRef} />}
    />
  )
}

پارامترها

پارامترنوعپیش‌فرضتوضیح
onLoadMore() => void—تابعی که هنگام رسیدن به sentinel فراخوانی می‌شود
hasMoreboolean—آیا داده بیشتری برای بارگذاری وجود دارد
isLoadingbooleanfalseجلوگیری از فراخوانی مجدد هنگام بارگذاری
rootMarginstring"200px"فاصله پیش‌بارگذاری قبل از رسیدن به sentinel
thresholdnumber0درصد نمایان بودن sentinel برای فعال‌سازی

مقدار بازگشتی

فیلدنوعتوضیح
sentinelRefReact.RefCallback<HTMLElement>ref برای اتصال به المان sentinel

هوک‌های مرتبط

  • برای debounce کردن جستجو قبل از بارگذاری → useDebounce
  • برای قفل اسکرول هنگام باز بودن modal → useScrollLock