リレー ページネーション アルゴリズムの詳細については、https ://facebook.github.io/relay/graphql/connections.htm#sec-Pagination-algorithm を参照してください。
hasNextPage に関する特定の質問に答えるには、次のアルゴリズムを使用します。
function hasNextPage(allEdges, before, after, first, last) {
// If first was not set, return false.
if (first === null) { return false; }
// Apply the before & after cursor arguments to the set of edges.
// i.e. edges is the set of edges between the before and after cursors
const edges = ApplyCursorsToEdges(allEdges, before, after)
// If more edges exist between the before & after cursors than
// you are asking for then there is a next page.
if (edges.length > first) { return true; }
return false
}
カーソルとページベースのページネーションに関する簡単なメモ。一般に、固定ページ サイズを使用してページ分割することはお勧めできません。この典型的な例は、SQL で OFFSET キーワードを使用して次のページを取得することです。このアプローチには多くの問題があります。たとえば、セットのページネーションの途中で新しいオブジェクトが挿入された場合はどうなるでしょうか? 現在グラブしているページの前に新しいオブジェクトが挿入され、固定オフセットを使用している場合、既にグラブしているオブジェクトをグラブすることになり、プレゼンテーション層でデータが重複することになります。ページネーションにカーソルを使用すると、オブジェクトの数ではなくオブジェクト自体を追跡できるため、この問題が解決されます。
特にリレーページネーションの最後のこと。いつでも (first & after) OR (last & before) のみを使用することをお勧めします。同じクエリで両方を使用すると、論理的ではあるが予期しない結果が生じる可能性があります。
頑張ってください!