【问题标题】:Confused why returnPartialData works without a field policy in Apollo Client 3困惑为什么 returnPartialData 在 Apollo Client 3 中没有字段策略的情况下工作
【发布时间】: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


    【解决方案1】:

    哇,原来我很久以前就制定了一项外勤政策并忘记了它......xD

        typePolicies: {
          Query: {
            fields: {
              product: {
                read (_, { args, toReference }) {
                  return toReference({
                    __typename: 'Product',
                    id: args.id
                  })
                }
              }
            }
          }
        }
    

    【讨论】:

      猜你喜欢
      • 2015-09-06
      • 2013-08-25
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 2015-09-17
      • 2021-04-02
      • 2019-07-03
      • 1970-01-01
      相关资源
      最近更新 更多