0Pricing
React Academy · درس

التمرير اللانهائي وتقسيم الصفحات باستخدام useInfiniteQuery

اجلب البيانات المقسمة إلى صفحات وحمّل الصفحات الإضافية بسلاسة باستخدام useInfiniteQuery.

التمرير اللانهائي وتقسيم الصفحات باستخدام useInfiniteQuery درس مجاني في React Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

مرحبًا

في هذا الدرس، ستستخدمون useInfiniteQuery لجلب البيانات المقسمة إلى صفحات، وستنفّذون نمط التمرير اللانهائي الذي يحمّل صفحات إضافية أثناء تمرير المستخدم.

ما هي useInfiniteQuery؟

تجلب useInfiniteQuery البيانات على شكل «صفحات». تُجلب كل صفحة بشكل منفصل وتُضاف إلى القائمة المخزنة مؤقتًا. وتوفّر الأدوات fetchNextPage وhasNextPage وisFetchingNextPage.

الإعداد الأساسي

حدّد initialPageParam وgetNextPageParam. تستقبل queryFn قيمة pageParam الحالية، ويجب أن تُعيد صفحة من النتائج.
const { data, fetchNextPage, hasNextPage } = useInfiniteQuery({
  queryKey: ['posts'],
  queryFn: ({ pageParam }) =>
    fetch('/api/posts?cursor=' + pageParam).then(r => r.json()),
  initialPageParam: 0,
  getNextPageParam: (lastPage) => lastPage.nextCursor ?? undefined,
});

getNextPageParam

تستقبل getNextPageParam آخر صفحة جرى جلبها وجميع الصفحات. أعد مؤشر الصفحة التالية أو رقمها، أو undefined/null للإشارة إلى عدم وجود صفحات أخرى، مما يضبط hasNextPage على false.
getNextPageParam: (lastPage, allPages) => {
  return lastPage.hasMore ? lastPage.nextCursor : undefined;
}

عرض جميع الصفحات

‏data.pages عبارة عن مصفوفة من نتائج الصفحات. افردها لعرض جميع العناصر في قائمة متصلة.
const allPosts = data.pages.flatMap(page => page.items);

return (
  <ul>
    {allPosts.map(post => <li key={post.id}>{post.title}</li>)}
  </ul>
);

زر تحميل المزيد

أضف زرًا باسم Load More يستدعي fetchNextPage. عطّله عند عدم وجود صفحات أخرى أو أثناء إجراء عملية جلب.
<button
  onClick={() => fetchNextPage()}
  disabled={!hasNextPage || isFetchingNextPage}
>
  {isFetchingNextPage ? 'Loading...' : hasNextPage ? 'Load More' : 'No more posts'}
</button>

التمرير اللانهائي باستخدام IntersectionObserver

اربط IntersectionObserver بعنصر div مخصّص للإشارة في أسفل القائمة. عند دخوله إلى إطار العرض، استدعِ fetchNextPage تلقائيًا.
const observerRef = useRef();
useEffect(() => {
  const observer = new IntersectionObserver(entries => {
    if (entries[0].isIntersecting && hasNextPage) fetchNextPage();
  });
  if (observerRef.current) observer.observe(observerRef.current);
  return () => observer.disconnect();
}, [hasNextPage, fetchNextPage]);

<div ref={observerRef} />  {/* sentinel at bottom */}

التمرير اللانهائي ثنائي الاتجاه

في تطبيقات الدردشة، ادعم التمرير في الاتجاهين: استخدم fetchNextPage لجلب الرسائل الأقدم، وgetPreviousPageParam/fetchPreviousPage لجلب الرسائل الأحدث.

التقسيم إلى صفحات حسب الصفحة مقابل المؤشر

التقسيم حسب الإزاحة أو الصفحة: تكون initialPageParam=1، وتُعيد getNextPageParam قيمة lastPage.page + 1. التقسيم حسب المؤشر: استخدم معرّف العنصر الأخير مؤشرًا. ويكون التقسيم حسب المؤشر أكثر استقرارًا مع البيانات المباشرة.
// Offset-based
getNextPageParam: (lastPage) => lastPage.page + 1

إعادة جلب الاستعلامات اللانهائية

يؤدي استدعاء invalidateQueries على استعلام لانهائي إلى إعادة جلب الصفحة الأولى فقط. لإعادة جلب جميع الصفحات، مثلًا بعد إضافة منشور جديد، استخدم queryClient.resetQueries أو refetchType: 'all'.

تحقق سريع

ما الذي يجب أن تُعيده getNextPageParam للإشارة إلى عدم وجود صفحات أخرى لتحميلها؟

مراجعة

يجمع useInfiniteQuery الصفحات في data.pages. استخدم flatMap لفردها وعرضها. أعد undefined من getNextPageParam لإيقاف التحميل. شغّل fetchNextPage عند النقر على زر أو عبر IntersectionObserver لتنفيذ التمرير اللانهائي.

اكتمل المقرر

تهانينا! لقد أنهيتم **React Query: Server State Management**. يمكنكم الآن جلب البيانات وتخزينها مؤقتًا وتعديلها وتقسيمها إلى صفحات وتنفيذ التمرير اللانهائي باستخدام TanStack Query.

الأسئلة الشائعة

هل درس «التمرير اللانهائي وتقسيم الصفحات باستخدام useInfiniteQuery» مجاني؟

نعم — نص درس «التمرير اللانهائي وتقسيم الصفحات باستخدام useInfiniteQuery» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «التمرير اللانهائي وتقسيم الصفحات باستخدام useInfiniteQuery»؟

اجلب البيانات المقسمة إلى صفحات وحمّل الصفحات الإضافية بسلاسة باستخدام useInfiniteQuery. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «التمرير اللانهائي وتقسيم الصفحات باستخدام useInfiniteQuery»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إعداد React Query وQueryClient
  2. التخزين المؤقت ومدة القِدم وإعادة الجلب في الخلفية
  3. الطفرات باستخدام useMutation
  4. التمرير اللانهائي وتقسيم الصفحات باستخدام useInfiniteQuery
← العودة إلى React Academy