keyFields (apollo)
objectの同一性を決めるkeyを指定する
デフォルトの挙動
デフォルトではレスポンスを正規化して保存する
下記クエリのレスポンスを
code:graphql
query {
user(id: "1") {
id
name
}
}
下記のように保存する
code:js
{
"User:1": { id: "1", name: "Alice" }
}
この "User:1" というキーを作るために使われるのが keyFields
実例
レスポンスにidがある場合 (デフォルト)
keyFields: ["id"]
デフォルトでは id ・ _id を探してキーと設定される
逆に言えば、どちらも存在しない場合、毎回新しいオブジェクトとして扱うため、キャッシュが効かないことに注意mrsekut.icon
レスポンスにidがない場合
idの代わりに、skuで区別したい
code:js
new InMemoryCache({
typePolicies: {
Product: {
keyFields: "sku", // skuを一意識別子として使う },
},
});
複数条件で識別したい場合は複合キーにする
code:js
new InMemoryCache({
typePolicies: {
Review: {
},
},
});
キャッシュしたくない
keyFields: false
常に別オブジェクト扱いになる
手動でキーを生成する (keyFields: false + keyFn)
例
code:js
new InMemoryCache({
typePolicies: {
Product: {
keyFields: false,
keyFn: (object) => ${object.category}:${object.sku},
},
},
});
これで Product:electronics:12345 のようなキーが作られる