usePaginationFragment
usePaginationFragment
usePaginationFragment
を使用して、@connection
を使用し、その上でページネーションを行うフラグメントをレンダリングできます
import type {FriendsList_user$key} from 'FriendsList_user.graphql';
const React = require('React');
const {graphql, usePaginationFragment} = require('react-relay');
type Props = {
user: FriendsList_user$key,
};
function FriendsList(props: Props) {
const {
data,
loadNext,
loadPrevious,
hasNext,
hasPrevious,
isLoadingNext,
isLoadingPrevious,
refetch, // For refetching connection
} = usePaginationFragment(
graphql`
fragment FriendsListComponent_user on User
@refetchable(queryName: "FriendsListPaginationQuery") {
name
friends(first: $count, after: $cursor)
@connection(key: "FriendsList_user_friends") {
edges {
node {
name
age
}
}
}
}
`,
props.user,
);
return (
<>
<h1>Friends of {data.name}:</h1>
<List items={data.friends?.edges.map(edge => edge.node)}>
{node => {
return (
<div>
{node.name} - {node.age}
</div>
);
}}
</List>
<Button onClick={() => loadNext(10)}>Load more friends</Button>
</>
);
}
module.exports = FriendsList;
引数
fragment
:graphql
テンプレートリテラルを使用して指定されたGraphQLフラグメント。- このフラグメントには、接続フィールドに
@connection
ディレクティブが必要です。そうでない場合は、使用するとエラーがスローされます。 - このフラグメントには
@refetchable
ディレクティブが必要です。そうでない場合は、使用するとエラーがスローされます。@refetchable
ディレクティブは、「リフェッチ可能」なフラグメント、つまりViewer
型またはQuery
型、またはNode
を実装する型 (つまりid
を持つ型) で宣言されたフラグメントにのみ追加できます。- ページネーションクエリを手動で指定する必要は *ない* ことに注意してください。
@refetchable
ディレクティブは、指定されたqueryName
でクエリを自動生成します。これにより、生成されたファイル:<queryName>.graphql.js
からインポートできるクエリの Flow 型も生成されます。
- ページネーションクエリを手動で指定する必要は *ない* ことに注意してください。
- このフラグメントには、接続フィールドに
fragmentReference
: *フラグメント参照* は、Relay がストアからフラグメントのデータを読み取るために使用する不透明な Relay オブジェクトです。より具体的には、データが読み取られる特定のオブジェクトインスタンスに関する情報が含まれています。- フラグメント参照の型は、生成された Flow 型からファイル
<fragment_name>.graphql.js
からインポートでき、Props
の型を宣言するために使用できます。フラグメント参照型の名前は<fragment_name>$key
になります。フラグメント参照 prop の型が正しく宣言されていることを強制するために、lint ruleを使用します。
- フラグメント参照の型は、生成された Flow 型からファイル
戻り値
次のプロパティを含むオブジェクト
data
: Relay ストアから読み取られたデータを含むオブジェクト。オブジェクトは、指定されたフラグメントの形状と一致します。- データの Flow 型もこの形状と一致し、GraphQL スキーマから派生した型が含まれます。
isLoadingNext
: 接続内の *次の* 項目のページネーションリクエスト (インクリメンタルデータペイロードを含む) が現在進行中かどうかを示すブール値。isLoadingPrevious
: 接続内の *前の* 項目のページネーションリクエスト (インクリメンタルデータペイロードを含む) が現在進行中かどうかを示すブール値。hasNext
: 接続の末尾が「前方」方向に到達したかどうかを示すブール値。その方向にクエリする項目がさらに存在する場合は true になり、それ以外の場合は false になります。hasPrevious
: 接続の末尾が「後方」方向に到達したかどうかを示すブール値。その方向にクエリする項目がさらに存在する場合は true になり、それ以外の場合は false になります。loadNext
: 「前方」方向の接続でより多くの項目をフェッチするために使用される関数。- 引数
count
: ページネーションリクエストでクエリする項目の数を示す数値。options
: *[オプション]* オプションオブジェクトonComplete
: リフェッチリクエストが完了するたびに (インクリメンタルデータペイロードを含む) 呼び出される関数。リクエスト中にエラーが発生した場合、onComplete
は最初のパラメータとしてError
オブジェクトを指定して呼び出されます。
- 戻り値
disposable
:dispose
関数を含むオブジェクト。disposable.dispose()
を呼び出すと、ページネーションリクエストがキャンセルされます。
- 動作
loadNext
を呼び出しても、コンポーネントが中断される *ことはありません*。代わりに、リクエストが進行中はisLoadingNext
値が true に設定され、ページネーションリクエストからの新しい項目が接続に追加され、コンポーネントが再レンダリングされます。loadNext
の呼び出しから開始されたページネーションリクエストは、ページネーション変数 (ページネーションを実行するために変更する必要がある) を *除く*、接続をフェッチするために最初に使用されたものと同じ変数を使用 *常に* します。ページネーション中にページネーション変数以外の変数を変更することは意味がありません。異なる接続に対してクエリを実行することになるからです。
- 引数
loadPrevious
: 「後方」方向の接続でより多くの項目をフェッチするために使用される関数。- 引数
count
: ページネーションリクエストでクエリする項目の数を示す数値。options
: *[オプション]* オプションオブジェクトonComplete
: リフェッチリクエストが完了するたびに (インクリメンタルデータペイロードを含む) 呼び出される関数。リクエスト中にエラーが発生した場合、onComplete
は最初のパラメータとしてError
オブジェクトを指定して呼び出されます。
- 戻り値
disposable
:dispose
関数を含むオブジェクト。disposable.dispose()
を呼び出すと、ページネーションリクエストがキャンセルされます。
- 動作
loadPrevious
を呼び出しても、コンポーネントが中断される *ことはありません*。代わりに、リクエストが進行中はisLoadingPrevious
値が true に設定され、ページネーションリクエストからの新しい項目が接続に追加され、コンポーネントが再レンダリングされます。loadPrevious
の呼び出しから開始されたページネーションリクエストは、ページネーション変数 (ページネーションを実行するために変更する必要がある) を *除く*、接続をフェッチするために最初に使用されたものと同じ変数を使用 *常に* します。ページネーション中にページネーション変数以外の変数を変更することは意味がありません。異なる接続に対してクエリを実行することになるからです。
- 引数
refetch
: 新しい変数セットを使用して接続フラグメントをリフェッチするために使用される関数。- 引数
variables
:@refetchable
クエリのフェッチに使用する新しい変数値を格納するオブジェクト。- これらの変数は、フラグメント内で参照されている GraphQL 変数と一致する必要があります。
- ただし、リフェッチリクエストで変更する予定の変数のみを指定する必要があります。この入力から省略されたフラグメントによって参照される変数は、元の親クエリで指定された値を使用します。たとえば、フラグメントを最初にフェッチしたときとまったく同じ変数でリフェッチするには、
refetch({})
を呼び出すことができます。 - 同様に、
$id
変数にid
値を渡すのは、フラグメントが別のid
でリフェッチする必要がない限り *オプション* です。@refetchable
フラグメントをリフェッチする場合、Relay はレンダリングされたオブジェクトの id をすでに認識しています。
options
: *[オプション]* オプションオブジェクトfetchPolicy
: キャッシュされたデータを使用するかどうか、および利用可能なキャッシュデータに基づいてネットワークリクエストを送信するタイミングを決定します。詳細については、フェッチポリシーセクションを参照してください。onComplete
: リフェッチリクエストが完了するたびに (インクリメンタルデータペイロードを含む) 呼び出される関数。
- 戻り値
disposable
:dispose
関数を含むオブジェクト。disposable.dispose()
を呼び出すと、リフェッチリクエストがキャンセルされます。
- 動作
- 新しい変数セットを使用して
refetch
を呼び出すと、フラグメントが *新たに提供された変数を使用して* 再度フェッチされます。指定する必要がある変数は、フラグメント内で参照されている変数のみであることに注意してください。この例では、lang
変数に新しい値を渡して、現在レンダリングされているコメントの翻訳された本文をフェッチすることを意味します。 refetch
を呼び出すと、コンポーネントが再レンダリングされ、指定されたfetchPolicy
と、キャッシュされたデータが利用可能かどうか、またはネットワークリクエストを送信して待機する必要があるかによって、*中断* する可能性があります。リフェッチによってコンポーネントが中断された場合は、このコンポーネントをラップするSuspense
バウンダリがあることを確認する必要があります。- Suspense の詳細については、「Suspense を使用した読み込み状態」ガイドを参照してください。
- 新しい変数セットを使用して
- 引数
動作
- コンポーネントはフラグメントデータの更新を自動的にサブスクライブします。この特定の
User
のデータがアプリ内のどこかで更新された場合 (たとえば、新しいデータをフェッチしたり、既存のデータを変更したりした場合)、コンポーネントは最新の更新されたデータで自動的に再レンダリングされます。 - 特定のフラグメントのデータが不足しており、そのデータが現在親クエリによってフェッチされている場合、コンポーネントは中断されます。
- Suspense の詳細については、「Suspense を使用した読み込み状態」ガイドを参照してください。
- ページネーション (
loadNext
またはloadPrevious
) では、コンポーネントが中断される *ことはありません*。
PaginationContainer
との違い
- ページネーションクエリは、
@refetchable
フラグメントを使用することで Relay によって自動的に生成されるため、この API では指定する必要がなくなりました。 - この API は、すぐに使用できる双方向の同時ページネーションをサポートしています。
- この API では、
PaginationContainer
のように、getVariables
またはgetFragmentVariables
構成関数を渡す必要がなくなりました。- これは、これまで曖昧に定義されていた概念であった、ページネーションに
variables
とfragmentVariables
の区別がなくなったことを意味します。ページネーションリクエストは、ページネーションを実行するために変更が必要なページネーション変数以外は、接続の取得に最初に使用されたものと同じ変数を使用します。ページネーション中にページネーション変数以外の変数を変更することは、異なる接続をクエリすることになるため、意味がありません。
- これは、これまで曖昧に定義されていた概念であった、ページネーションに
- このAPIは、(Pagination Containerのように)
direction
やgetConnectionFromProps
関数のような追加の設定を受け付けなくなりました。これらの値はRelayによって自動的に決定されます。 - リフェッチでは、これまで曖昧に定義されていた概念であった
variables
とfragmentVariables
の区別はなくなりました。リフェッチは常に、提供された変数を使用してフラグメントを正しくリフェッチおよびレンダリングします(入力で省略された変数は、親クエリの元の値を使用するようにフォールバックします)。 - リフェッチはコンポーネントを明確に更新します。これは、
PaginationContainer
からrefetchConnection
を呼び出した場合に常に真実だったとは限りませんでした(リフェッチクエリで何をクエリしているか、およびフラグメントが正しいオブジェクトタイプで定義されているかに依存していました)。
このページは役に立ちましたか?
サイトをより良くするために、 いくつかの簡単な質問にお答えください.