Discover how to browse endless lists without losing your place or waiting forever!
Why Cursor-based pagination in GraphQL? - Purpose & Use Cases
Imagine you have a huge list of friends on a social app. You want to see them 10 at a time. Without a smart way, you might try to load all friends at once or jump to a page by counting manually.
Loading all friends at once is slow and uses too much memory. Counting pages manually can cause mistakes, like missing or repeating friends when new ones join or leave.
Cursor-based pagination uses a unique marker (cursor) to remember where you left off. It fetches the next set of friends smoothly, even if the list changes, making browsing fast and reliable.
query { friends(page: 3, size: 10) { id name } }query { friends(after: "cursor123", first: 10) { edges { node { id name } cursor } pageInfo { hasNextPage endCursor } } }It enables smooth, efficient browsing through large or changing lists without missing or repeating items.
Scrolling through Instagram posts where new posts appear anytime, but you still see a continuous, seamless feed without confusion.
Manual page counting is slow and error-prone.
Cursor-based pagination remembers your place with a unique marker.
This method handles changing data smoothly and efficiently.
Practice
Solution
Step 1: Understand pagination purpose
Pagination is used to split large data into smaller parts for easier handling.Step 2: Identify cursor role
Cursor marks the position in the data to fetch the next part without overlap or missing items.Final Answer:
To fetch data in small parts using a cursor to mark position -> Option CQuick Check:
Cursor-based pagination = fetch data in parts [OK]
- Thinking pagination fetches all data at once
- Confusing cursor with sorting
- Assuming pagination deletes data
Solution
Step 1: Recall GraphQL cursor pagination syntax
The standard usesfirstto limit items andafterto specify the cursor.Step 2: Match options with correct syntax
{ items(first: 5, after: "cursor123") { edges { node } } }usesfirstandaftercorrectly; others use incorrect argument names.Final Answer:
{ items(first: 5, after: "cursor123") { edges { node } } } -> Option DQuick Check:
Use first and after arguments [OK]
- Using limit instead of first
- Using startAfter or afterCursor which are invalid
- Confusing argument names
{ users(first: 3, after: "YXJyYXljb25uZWN0aW9uOjE=") { edges { node { id name } } pageInfo { hasNextPage endCursor } } }What does the
endCursor represent in the result?Solution
Step 1: Understand pageInfo fields
endCursormarks the cursor of the last item returned in the current page.Step 2: Differentiate from other fields
hasNextPageshows if more pages exist;endCursoris not a count or first item cursor.Final Answer:
The cursor of the last item in the current page -> Option AQuick Check:
endCursor = last item cursor [OK]
- Confusing endCursor with total count
- Thinking endCursor is first item cursor
- Assuming endCursor is page count
{ posts(first: 10, afterCursor: "abc123") { edges { node { title } } } }Why does this query fail?
Solution
Step 1: Check argument names for cursor pagination
The correct argument to specify the cursor isafter, notafterCursor.Step 2: Validate other parts
firstaccepts a number;edgesis valid; cursor values are strings.Final Answer:
The argument should be namedafter, notafterCursor-> Option AQuick Check:
Use 'after' argument name [OK]
- Using incorrect argument names
- Thinking first must be string
- Misunderstanding edges field usage
{ comments(first: 4) { edges { node { id text } } pageInfo { hasNextPage endCursor } } }To fetch the next batch, which query should you use?
Solution
Step 1: Understand how to continue pagination
Use theafterargument with theendCursorvalue from the previous page to fetch the next batch.Step 2: Check argument correctness
first: 4limits to 4 items;aftermoves cursor forward;beforeorlastare for backward pagination.Final Answer:
{ comments(first: 4, after: "endCursor_value") { edges { node { id text } } pageInfo { hasNextPage endCursor } } } -> Option BQuick Check:
Use first and after with endCursor for next batch [OK]
- Using before instead of after for next page
- Using last instead of first for forward pagination
- Using limit instead of first argument
Ready to prove it?
Pass the test and this pattern moves unknown
