【问题标题】:How to pass parameter to graphql fragment?如何将参数传递给graphql片段?
【发布时间】:2019-08-20 06:12:25
【问题描述】:

将参数传递给 GraphQL 查询很容易。但是 GraphQL 片段呢?

这段代码包含一些完全正常的查询,带有一个参数(itemId)和一个提示我尝试做什么(includeExtraResults):

export const GET_ITEM = gql`
  query GetItem($itemId: ID!, $includeExtraResults:BOOLEAN) {
    container {
      item(itemId: $itemId) {
        itemId
        someField
        innerItem(someExtraOption: $includeExtraResults) {
          ...InnerItemFragment
        }
      }
    }
  }
  ${INNER_ITEM_FRAGMENT}
`;

export const INNER_ITEM_FRAGMENT = gql`
  fragment InnerItemFragment on InnerItemType {
    innerItemId
    innerInnerItem(someExtraOption: $includeExtraResults) {
      someFields
    }
  }
  ${INNER_INNER_ITEM_FRAGMENT}
`;


export const INNER_INNER_ITEM_FRAGMENT = gql`
  /* (not detailed here) */
`;

当内部项目作为内部项目的一部分被自动查询时,我不希望它们返回基于过滤器工作的 字段。客户也不知道逻辑。相反,我想使用参数,逻辑由服务器端决定。

不过,他们的查询以一种需要(可选)参数“includeExtraResults”的方式实现,该参数首先传递给 GetItem。

那么,有没有办法将“includeExtraResults”传递给内部片段?为了有意义,应该改变什么?在现实生活中,这是一个复杂的系统,具有许多层次的内部碎片。

【问题讨论】:

    标签: react-native graphql


    【解决方案1】:

    正如here 所述,您必须在使用片段变量之前显式启用它们:

    import { enableExperimentalFragmentVariables } from 'graphql-tag'
    
    enableExperimentalFragmentVariables()
    

    这至少应该让您在包含的片段中使用在操作中定义的变量。请注意,这仍然是一个实验性功能,不是规范的正式组成部分——请参阅this issue 了解正在进行的对话。

    【讨论】:

    • 你可以添加一个例子来演示stackoverflow中的语法吗?
    • @jeancallisti 以上应该适用于您问题中的代码。除了启用该功能外,无需进行任何更改。语法有什么不清楚的地方?
    • 好吧,如果它“按原样”工作并且 includeExtraResults 可以传递给 innerInnerItem,那么我很好。我想知道如果我将该片段包含在另一个没有参数的查询中,编译器会如何反应,但那是另一天的事了。
    • 我认为graphql-tag 仍然会解析它,但您肯定会遇到服务器错误,因为您的查询不会通过验证。
    【解决方案2】:

    虽然不一样,但还是相关的:

    您可以在 Fragments 中使用查询的变量:

    query HeroComparison($first: Int = 3) {
      leftComparison: hero(episode: EMPIRE) {
        ...comparisonFields
      }
      rightComparison: hero(episode: JEDI) {
        ...comparisonFields
      }
    }
    
    fragment comparisonFields on Character {
      name
      friendsConnection(first: $first) {
        totalCount
        edges {
          node {
            name
          }
        }
      }
    }
    

    此信息来自the official guide

    【讨论】:

    • 这实际上是我试图实现的,所以我已经将“正确答案”更改为您的答案(在另一个答案有绿色勾号的近 3 年后;-p)。我不记得为什么会遇到问题,以及是什么让我相信我无法在片段中使用全局查询参数。也许我正在使用一些自动生成的 Typescript 包装器和/或一些语法检查工具 (Lint),它们对此提出了警告。或者也许我只是没有足够的勇气去假设它会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 2017-05-28
    • 2017-01-02
    • 2017-09-27
    • 2023-01-26
    • 1970-01-01
    相关资源
    最近更新 更多