【发布时间】:2021-11-21 21:50:17
【问题描述】:
在我的应用程序中,我正在搜索产品,然后单击产品以查看有关它的更多详细信息。
我在每个页面上执行一个 GraphQL 查询。 SEARCH 查询返回类型[Product],PRODUCT 查询返回类型Product。
// Search page
const SEARCH = gql`
query Search($query: String!) {
searchResults: search(query: $query) {
id
name
images
price
}
}
`
// ProductDetail page
const PRODUCT = gql`
query Product($id: Int!) {
product(id: $id) {
id
name
images
optionSetName
options {
id
images
name
}
price
}
}
`
我在PRODUCT 查询中启用了returnPartialData,因为该产品的某些字段已经存在于SEARCH 查询的缓存中,我想在服务器请求返回之前访问它们。
我想我还必须apply a field policy 来引用预先存在的Product,因为我不知道PRODUCT 怎么知道它的返回类型是什么。
但是,当我执行以下操作时:
const { loading, data: { product } = {} } = useQuery(
PRODUCT,
{ variables: { id: productId, isShallow }, returnPartialData: true }
)
console.log(product)
以下内容记录到控制台(第一个来自returnPartialData,第二个来自服务器):
PRODUCT 查询不知何故与现有的Product 相关联,而我没有明确编写缓存重定向。
我很困惑这是怎么发生的?看来 Apollo 一定是引用了 GraphQL 架构,并且已经看到 PRODUCT 的返回类型是 Product,然后自动使用 id arg 引用现有产品。
使用"@apollo/client": "^3.4.1"
【问题讨论】:
标签: graphql apollo apollo-client