欠落データの補完(欠落フィールドハンドラー)
前のセクションでは、完全または部分的にキャッシュされたデータを再利用する方法について説明しましたが、Relayが特定のクエリを満たすために、他のクエリからの既存のデータの一部を自動的に再利用できるかどうかを判断できない場合があります。具体的には、Relayは以前にフェッチされたクエリに対してキャッシュされたデータを再利用する方法を知っています。つまり、まったく同じクエリを2回フェッチすると、Relayは2回目に評価しようとしたときに、そのクエリのデータがキャッシュされていることを認識します。
ただし、異なるクエリを使用している場合でも、異なるクエリが同じデータを参照している場合があり、再利用できることが望ましいです。たとえば、次の2つのクエリを考えてみましょう。
// Query 1
query UserQuery {
user(id: 4) {
name
}
}
// Query 2
query NodeQuery {
node(id: 4) {
... on User {
name
}
}
}
これらの2つのクエリは異なりますが、まったく同じデータを参照しています。理想的には、いずれかのクエリがすでにストアにキャッシュされている場合、もう一方のクエリをレンダリングする際にそのデータを再利用できるはずです。ただし、Relayにはデフォルトでこの知識がないため、node(id: 4)
がuser(id: 4)
と「同じである」という知識をエンコードするように構成する必要があります。
これを行うには、RelayEnvironment
にmissingFieldHandlers
を提供して、この知識を指定します。
const {ROOT_TYPE, Environment} = require('relay-runtime');
const missingFieldHandlers = [
{
handle(field, record, argValues): ?string {
// Make sure to add a handler for the node field
if (
record != null &&
record.getType() === ROOT_TYPE &&
field.name === 'node' &&
argValues.hasOwnProperty('id')
) {
return argValues.id
}
if (
record != null &&
record.getType() === ROOT_TYPE &&
field.name === 'user' &&
argValues.hasOwnProperty('id')
) {
// If field is user(id: $id), look up the record by the value of $id
return argValues.id;
}
if (
record != null &&
record.getType() === ROOT_TYPE &&
field.name === 'story' &&
argValues.hasOwnProperty('story_id')
) {
// If field is story(story_id: $story_id), look up the record by the
// value of $story_id.
return argValues.story_id;
}
return undefined;
},
kind: 'linked',
},
];
const environment = new Environment({/*...*/, missingFieldHandlers});
missingFieldHandlers
はハンドラーの配列です。各ハンドラーはhandle
関数と、処理方法を知っている欠落フィールドの種類を指定する必要があります。処理する必要がある主なフィールドの2つのタイプは次のとおりです。- 'scalar':これは、数値や文字列などのスカラー値を含むフィールドを表します。
- 'linked':これは、スカラーではなく別のオブジェクトを参照するフィールドを表します。
handle
関数は、欠落しているフィールド、そのフィールドが属するレコード、およびクエリの現在の実行でフィールドに渡された引数を受け取ります。- 'scalar'フィールドを処理する場合、handle関数は、欠落フィールドの値として使用するためにスカラー値を返す必要があります。
- 'linked'フィールドを処理する場合、handle関数は、欠落フィールドの代わりに使用するストア内の別のオブジェクトを参照するIDを返す必要があります。**
- Relayがローカルキャッシュからクエリを満たそうとすると、欠落データが検出されるたびに、データが欠落していると断定的に宣言する前に、指定された欠落フィールドハンドラーのうち、フィールドタイプに一致するものが実行されます。
このページは役に立ちましたか?
サイトをさらに改善するためにご協力ください。 簡単な質問にいくつか答える.