0

「最初の」パラメータのみが渡された場合、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 /リレーフレンドカウントに渡すことができますか?

4

2 に答える 2

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

特にリレーページネーションの最後のこと。いつでも (first & after) OR (last & before) のみを使用することをお勧めします。同じクエリで両方を使用すると、論理的ではあるが予期しない結果が生じる可能性があります。

頑張ってください!

于 2016-06-28T20:17:53.553 に答える
1

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

hasNextPageRelay GraphQL 仕様では、取得された最後の要素の後にさらに項目があるかどうかを示すだけです。したがって、あなたの場合、合計で5つ以上の要素があり、そうするとより多くの要素が得られることを意味します

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

リストからカーソルを取得できます。これは、そこedgesにある要素の1つですnode

于 2016-04-06T09:00:58.090 に答える