中继:根据父查询的结果参数化 getFragment

Relay: Parametrize getFragment based on results of a parent query

我的 CMS return给我一个节点列表,每个节点都有自己的节点类型。对于每个节点类型,我都定义了相应的 GraphQL 类型。

type getContent {
  content: [ContentNode]
}

我想要这样的查询:

{
  content{
    contentType
    properties {
       ${ContentType.getFragment('content', type: $contentType???)}
    }
  }
}

ContentType 将 return 基于提供给它的类型变量的正确片段定义。但是如何从父结果中得到 $contentType

您不能拥有依赖于父级实际值的片段,因为片段是在向服务器实际发出查询请求之前组成的。有两种不同的方法来处理这个问题,一种是让片段根据变量而变化,另一种是在组件内部使用接口和类型化片段。

这是一个很好的答案,显示了使用变量的示例:

对于接口解决方案,如果您有一个 ContentNode 接口,其实现类似于 'ContentNode1' 和 'ContentNode2',那么您可以这样做:

{
  content {
    ${ContentType.getFragment('content')}
  }
}

并且在您的 ContentType 组件中

fragment on ContentNode {
   contentType
   someOtherCommonField
   ... on ContentNode1 {
     someContent1Field
   }

   ... on ContentNode2 {
     someContent2Field
   }
}