0Pricing
React Academy · บทเรียน

การเลื่อนแบบไม่สิ้นสุดและการแบ่งหน้า ด้วย useInfiniteQuery

ดึงข้อมูลแบบแบ่งหน้าและโหลดหน้าถัดไปได้อย่างต่อเนื่องด้วย useInfiniteQuery

การเลื่อนแบบไม่สิ้นสุดและการแบ่งหน้า ด้วย useInfiniteQuery เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

ยินดีต้อนรับ

ในบทเรียนนี้ คุณจะใช้ useInfiniteQuery เพื่อดึงข้อมูลที่แบ่งหน้า และใช้รูปแบบการเลื่อนแบบไม่สิ้นสุดซึ่งโหลดหน้าเพิ่มเติมเมื่อผู้ใช้เลื่อนหน้าจอ

useInfiniteQuery คืออะไร

useInfiniteQuery จะดึงข้อมูลเป็น 'pages' โดยแต่ละหน้าจะถูกดึงแยกกันแล้วต่อท้ายรายการที่แคชไว้ นอกจากนี้ยังมีเครื่องมือ 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>
);

ปุ่มโหลดเพิ่มเติม

เพิ่มปุ่ม 'โหลดเพิ่มเติม' ที่เรียกใช้ 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 แบบเคอร์เซอร์: ใช้ ID ของรายการสุดท้ายเป็นเคอร์เซอร์ การแบ่งหน้าแบบเคอร์เซอร์มีเสถียรภาพมากกว่าสำหรับข้อมูลที่เปลี่ยนแปลงแบบเรียลไทม์
// Offset-based
getNextPageParam: (lastPage) => lastPage.page + 1

การดึงข้อมูลคิวรีแบบไม่สิ้นสุดใหม่

การเรียกใช้ invalidateQueries กับคิวรีแบบไม่สิ้นสุดจะดึงข้อมูลใหม่เฉพาะหน้าแรกเท่านั้น หากต้องการดึงข้อมูลทุกหน้าใหม่ (เช่น หลังเพิ่มโพสต์ใหม่) ให้ใช้ queryClient.resetQueries หรือ refetchType: 'all'

ตรวจสอบอย่างรวดเร็ว

getNextPageParam ต้องส่งคืนค่าใดเพื่อระบุว่าไม่มีหน้าให้โหลดเพิ่มเติม

สรุปทบทวน

useInfiniteQuery จะสะสมหน้าไว้ใน data.pages ให้ใช้ flatMap เพื่อรวมข้อมูลสำหรับการแสดงผล ใช้ getNextPageParam ที่ส่งคืนค่า undefined เพื่อหยุดการโหลด และเรียกใช้ fetchNextPage เมื่อคลิกปุ่มหรือเมื่อ IntersectionObserver ตรวจพบการเลื่อนแบบไม่สิ้นสุด

เรียนจบหลักสูตร

ยินดีด้วยค่ะ คุณเรียนจบ **React Query: การจัดการสถานะฝั่งเซิร์ฟเวอร์** แล้ว ขณะนี้คุณสามารถดึงข้อมูล แคช เปลี่ยนแปลงข้อมูล แบ่งหน้า และเลื่อนดูข้อมูลแบบไม่สิ้นสุดด้วย TanStack Query ได้แล้ว

คำถามที่พบบ่อย

บทเรียน “การเลื่อนแบบไม่สิ้นสุดและการแบ่งหน้า ด้วย useInfiniteQuery” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเลื่อนแบบไม่สิ้นสุดและการแบ่งหน้า ด้วย useInfiniteQuery” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเลื่อนแบบไม่สิ้นสุดและการแบ่งหน้า ด้วย useInfiniteQuery”

ดึงข้อมูลแบบแบ่งหน้าและโหลดหน้าถัดไปได้อย่างต่อเนื่องด้วย useInfiniteQuery คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การเลื่อนแบบไม่สิ้นสุดและการแบ่งหน้า ด้วย useInfiniteQuery” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่า React Query และ QueryClient
  2. การแคช อายุข้อมูล และการดึงข้อมูลเบื้องหลัง
  3. Mutation ด้วย useMutation
  4. การเลื่อนแบบไม่สิ้นสุดและการแบ่งหน้า ด้วย useInfiniteQuery
← กลับไปที่ React Academy