2016-04-05 10 views
0

「最初の」パラメータだけが渡された場合、graphNはどのようにhasNextPageを生成しますか?私はGraphQLリレーhasNextPage

return relay.connectionFromPromisedArray( global.app.get('model__user').getUsers(args), args );

とクエリを使用しています :

query RootQueryType { viewer { user(id: 1){ id,email,friends(first: 5) {edges {cursor, node { id, email } }, pageInfo { hasNextPage } } } } }

だから私はそうhasNextPageが正しい生成されますカウント/リレー友人をgraphqlに渡すことができますか?

答えて

1

リレーページネーションはページベースではなく、むしろcursorベースです。だから、「アイテムYの後にX個のアイテムがほしい」と言ってページ付けをします。項目Yは、ページ番号またはオフセットとして指し示されるのではなく、むしろその正確なオブジェクトへのポインタとして、いわゆるカーソルと呼ばれます。このページネーションのモデルは、無限スクロールなどに適しています。 「ページ」は、アイテムの数に依存しないので、アイテムの追加または削除後も安定しています。

hasNextPage Relay GraphQLの仕様では、最後に検索された要素の後にさらに項目があるかどうかを示しています。だからあなたの場合には、それは全部で5つの以上の要素があることを意味し、あなたが

friends(first: 5, after: "CURSOR_TO_THE_LAST_ELEMENT") 

を行う場合は、あなたがedgesリストからカーソルを取得することができますより多くの要素を得るでしょう、それはそこにnode並ん要素の一つです。

1

リレーページネーションアルゴリズムの詳細については、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キーワードを使用して次のページを取得することです。このアプローチには多くの問題があります。たとえば、セットの改ページ中に新しいオブジェクトが挿入された場合はどうなりますか?現在取り込んでいるページの前に新しいオブジェクトが挿入されていて固定オフセットを使用している場合は、既に取得したオブジェクトを取得してプレゼンテーションレイヤーのデータを複製します。改ページのためにカーソルを使用すると、オブジェクトの数ではなくオブジェクト自体を追跡できるので、この問題を修正します。

最後にリレーページネーションを指定してください。任意の時点で(前に&の後に)OR(最後に&)を使用することをお勧めします。同じクエリで両方を使用すると、論理的ではありますが予期しない結果につながります。

運が良かった!

関連する問題