不应该';是否在GraphQL中的片段调用上定义t变量?

不应该';是否在GraphQL中的片段调用上定义t变量?,graphql,graphql-fragments,Graphql,Graphql Fragments,我是GraphQL新手。我正在浏览网页,发现了一些我觉得很奇怪的东西 向片段中的变量传递数据的方法是通过片段所属的根查询来完成。为方便起见,此处重复文档中给出的示例 query HeroComparison($first: Int = 3) { leftComparison: hero(episode: EMPIRE) { ...comparisonFields } rightComparison: hero(episode: JEDI) { ...compariso

我是GraphQL新手。我正在浏览网页,发现了一些我觉得很奇怪的东西

向片段中的变量传递数据的方法是通过片段所属的根查询来完成。为方便起见,此处重复文档中给出的示例

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
      }
    }
  }
}
我的问题是,为什么
herocomparation
定义要传递给封闭片段的参数,而不是直接传递给片段?我们在片段中使用变量,所以不应该是这样的吗

query HeroComparison {
  leftComparison: hero(episode: EMPIRE) {
    ...comparisonFields($first: Int = 3)
  }
  rightComparison: hero(episode: JEDI) {
    ...comparisonFields($first: Int = 3)
  }
}

fragment comparisonFields on Character {
  name
  friendsConnection(first: $first) {
    totalCount
    edges {
      node {
        name
      }
    }
  }
}
因为这是重复的,我们甚至可以做类似的事情

query HeroComparison {
  leftComparison: hero(episode: EMPIRE) {
    ...comparisonFields
  }
  rightComparison: hero(episode: JEDI) {
    ...comparisonFields($first: Int = 2)
  }
}

fragment comparisonFields on Character {
  *var $first: Int
  name
  friendsConnection(first: $first = 3) {
    totalCount
    edges {
      node {
        name
      }
    }
  }
}

我问这个问题的主要问题是,如果我们希望
comparisonFields
的第一个实例化在相同的查询中获得值
3
,第二个实例化获得值
2
,该怎么办

文档页面对此没有提及任何内容


另外,从关注点分离的角度来看,第二种和第三种方法不是更好吗?

详细讨论了您的方法的优缺点。

根据规范-。。。变量是为操作定义的(简而言之,仅在外部查询/变异中声明…在“body”中,您只能“使用变量”/使用$value)。。。您可以使用别名以不同的值进行查询(定义两个变量,每个别名查询一个变量)。Hi@xadm谢谢您的回复。虽然我可以理解你的意思,但这不就是GraphQL带来的REST好处吗?哪一个?还是有可能你想要什么。。。仍然比其他人灵活得多