React アプリケーションで apollo クライアントを使い始めたばかりで、キャッシュに行き詰まっています。製品の ID と名前を取得するためのクエリを実行する製品のリストを含むホームページと、ID、名前、説明、および画像のクエリを実行する製品ページがあります。
ユーザーが最初にホームページにアクセスしてから特定の製品ページにアクセスして、その製品の説明と画像のクエリのみを実行し、読み込み中に名前も表示することを望みます (既にキャッシュしておく必要があるため)。ドキュメントの「ストアの制御」の部分(http://dev.apollodata.com/react/cache-updates.html)に従いましたが、それでも解決できませんでした。
製品ページに移動したときに実行されるクエリは、製品の ID と名前の両方を要求しますが、それらは既に要求しているため、キャッシュする必要があります。
私は何かが欠けていると思いますが、それを理解することはできません。コードの一部を次に示します。
// Create the apollo graphql client.
const apolloClient = new ApolloClient({
networkInterface: createNetworkInterface({
uri: `${process.env.GRAPHQL_ENDPOINT}`
}),
queryTransformer: addTypename,
dataIdFromObject: (result) => {
if (result.id && result.__typename) {
console.log(result.id, result.__typename); //can see this on console, seems okey
return result.__typename + result.id;
}
// Make sure to return null if this object doesn't have an ID
return null;
},
});
// home page query
// return an array of objects (Product)
export default graphql(gql`
query ProductsQuery {
products {
id, name
}
}
`)(Home);
//product page query
//return an object (Product)
export default graphql(gql`
query ProductQuery($productId: ID!) {
product(id: $productId) {
id, name, description, image
}
}
`,{
options: props => ({ variables: { productId: props.params.id } }),
props: ({ data: { loading, product } }) => ({
loading,
product,})
})(Product);
そして私のコンソール出力: