gpt4 book ai didi

reactjs - Apollo 客户端缓存

转载 作者:行者123 更新时间:2023-12-03 13:36:45 25 4
gpt4 key购买 nike

我刚刚开始在 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);

我的控制台输出:

console output

最佳答案

您的问题的答案实际上分为两部分:

  1. 客户端实际上无法确定这些查询是否解析到缓存中的同一对象,因为它们具有不同的路径。一个以 products 开头,另一个以 product 开头。有一个open PR对于客户端解析器,它可以让您向客户端提供有关在缓存中查找内容的提示,即使您没有明确查询它们。我预计我们将在一两周内发布该功能。

  2. 即使使用客户端解析器,Apollo Client 也不会完全按照您上面描述的操作,因为 Apollo Client 从 0.5 版本开始不再进行查询比较。相反,现在所有查询都是完全静态的。这意味着即使您的查询部分位于缓存中,完整的查询也会发送到服务器。这具有许多优点,在此 blog post 中列出。 .

通过在选项中设置 returnPartialData: true,您仍然可以首先显示缓存中的部分。

关于reactjs - Apollo 客户端缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40427609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com