中继:根据父查询的结果参数化 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
}
}
我的 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
}
}