困惑为什么 returnPartialData 在 Apollo Client 3 中没有字段策略的情况下工作
Confused why returnPartialData works without a field policy in Apollo Client 3
在我的应用程序中,我正在搜索产品,然后单击产品以查看有关它的更多详细信息。
我在每个页面上执行 GraphQL 查询。 SEARCH
查询 return 类型 [Product]
,PRODUCT
查询 return 类型 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
查询的缓存中,我想访问他们在服务器请求 returns.
之前
我想我还必须 apply a field policy 来引用先前存在的 Product
,因为我不知道 PRODUCT
甚至知道它是什么 return类型是。
但是,当我执行以下操作时:
const { loading, data: { product } = {} } = useQuery(
PRODUCT,
{ variables: { id: productId, isShallow }, returnPartialData: true }
)
console.log(product)
以下记录到控制台(第一个来自 returnPartialData
,第二个来自服务器):
不知何故 PRODUCT
查询已将自身与现有的 Product
相关联,而无需我明确编写缓存重定向。
我很困惑这是怎么发生的?似乎 Apollo 必须引用 GraphQL 模式,并且已经看到 PRODUCT
的 return 类型是 Product
,然后自动使用 id
arg 来引用现有的产品。
使用"@apollo/client": "^3.4.1"
哇,原来我很久以前制定了一项现场政策,后来忘记了...xD
typePolicies: {
Query: {
fields: {
product: {
read (_, { args, toReference }) {
return toReference({
__typename: 'Product',
id: args.id
})
}
}
}
}
}
在我的应用程序中,我正在搜索产品,然后单击产品以查看有关它的更多详细信息。
我在每个页面上执行 GraphQL 查询。 SEARCH
查询 return 类型 [Product]
,PRODUCT
查询 return 类型 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
查询的缓存中,我想访问他们在服务器请求 returns.
我想我还必须 apply a field policy 来引用先前存在的 Product
,因为我不知道 PRODUCT
甚至知道它是什么 return类型是。
但是,当我执行以下操作时:
const { loading, data: { product } = {} } = useQuery(
PRODUCT,
{ variables: { id: productId, isShallow }, returnPartialData: true }
)
console.log(product)
以下记录到控制台(第一个来自 returnPartialData
,第二个来自服务器):
不知何故 PRODUCT
查询已将自身与现有的 Product
相关联,而无需我明确编写缓存重定向。
我很困惑这是怎么发生的?似乎 Apollo 必须引用 GraphQL 模式,并且已经看到 PRODUCT
的 return 类型是 Product
,然后自动使用 id
arg 来引用现有的产品。
使用"@apollo/client": "^3.4.1"
哇,原来我很久以前制定了一项现场政策,后来忘记了...xD
typePolicies: {
Query: {
fields: {
product: {
read (_, { args, toReference }) {
return toReference({
__typename: 'Product',
id: args.id
})
}
}
}
}
}