Enhancing Salesforce Lightning with GraphQL Pagination in Lightning Web Components

koteeswaran ramachandran
2 min readDec 17, 2023

--

In the ever-evolving landscape of Salesforce development, the integration of GraphQL has opened new doors for creating dynamic, efficient, and user-friendly Lightning Web Components (LWC). One powerful aspect of GraphQL is its support for pagination, enabling developers to seamlessly navigate through large datasets. In this blog post, we’ll explore how to implement GraphQL pagination in a Lightning Web Component, providing users with a smooth and responsive experience.

Understanding the Components:

1. Lightning Web Components (LWC):

  • Lightning Web Components are a modern framework for building Lightning applications on the Salesforce platform.

2. GraphQL Pagination:

  • GraphQL supports pagination through the use of first and after arguments, allowing for the retrieval of specific data subsets.

Setting the Stage:

1. Create a Custom Object:

  • In Salesforce Setup, create a custom object named Book__c with relevant fields such as Title__c and Author__c.

2. Enable GraphQL and SOQL:

  • Ensure that the Salesforce Object Query Language (SOQL) and Lightning Platform GraphQL features are enabled in your Salesforce org.

Building the Lightning Web Component:

1. Component Structure (bookList):

<template>
<lightning-card title="Book List" icon-name="standard:book">
<template if:true={books.data}>
<ul>
<template for:each={books.data.books.edges} for:item="bookEdge">
<li key={bookEdge.node.id}>
{bookEdge.node.title} by {bookEdge.node.author}
</li>
</template>
</ul>
<div if:true={books.data.books.pageInfo.hasNextPage}>
<lightning-button label="Load More" onclick={loadMore}></lightning-button>
</div>
</template>
<template if:true={books.error}>
<div>Error fetching books: {books.error}</div>
</template>
</lightning-card>
</template>

2. JavaScript Logic (bookList.js):

import { LightningElement, wire } from 'lwc';
import { graphql, subscribe, unsubscribe } from 'lightning/apolloUtils';

import BOOKS_QUERY from './bookList.graphql';

export default class BookList extends LightningElement {
@wire(graphql, { query: BOOKS_QUERY })
books;

loadMore() {
if (this.books.data.books.pageInfo.hasNextPage) {
const endCursor = this.books.data.books.pageInfo.endCursor;
this.loadBooks(endCursor);
}
}

loadBooks(after) {
const variables = { after };
subscribe(this, BOOKS_QUERY, variables);
}

disconnectedCallback() {
unsubscribe(this);
}
}

3. GraphQL Query (bookList.graphql):

# bookList.graphql
query Books($after: String) {
books(first: 5, after: $after) @stream(initial_count: 5, next_records: 5) {
edges {
node {
id
title
author
}
cursor
}
pageInfo {
hasNextPage
endCursor
}
}
}

2. Testing the Lightning Web Component:

  • Add the bookList Lightning Web Component to a Lightning page, and you should be able to load more books as needed.

In this example, the @stream directive is used in the GraphQL query to enable real-time streaming of data. The loadMore function triggers the subscription to fetch additional records. This approach avoids the use of Apex and provides a dynamic and responsive experience for users in a Lightning Web Component.

--

--