2016-04-17 17 views
0

我的CMS向我返回一个节点列表,每个节点都有其自己的节点类型。对于每个节点类型,我都有相应的GraphQL类型定义。Relay:基于父查询的结果参数化getFragment

type getContent { 
    content: [ContentNode] 
} 

我要像一个查询:

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

的ContentType将根据提供给它的类型变量返回正确的片段定义。但是,如何从父母结果中获得$contentType

回答

2

您不能拥有依赖于父项的实际值的片段,因为片段在查询请求实际发送到服务器之前已经完成。有两种不同的方式来处理这个问题,一种是根据变量使片段变化,另一种是在组件中使用接口和类型化片段。

这里是在例如使用变量的一个很好的答案:Conditional fragments or embedded root-containers when using Relay with React-Native

对于接口的解决方案,如果您有ContentNode与像“ContentNode1”和“ContentNode2”,那么你可以做这样的事情实现的接口:

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

而在你的ContentType组件

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

    ... on ContentNode2 { 
    someContent2Field 
    } 
} 
+0

非常感谢伟大的答复。我将尝试探索你的接口解决方案,目前看起来非常有前景,并且一旦我终于得到它,将标志着你的答案被接受。 – Dmitri

+0

条件片段对我来说不起作用,因为路由信息不包含我渲染的元素的类型(因为这可能是元素的固定集合)。 但你的第二种方法似乎很酷。但有一个问题:当在ContentNode1 {'上做'...'这样的事情时,这个片段只能被包含在这个类型中吗?那么返回的信息不会有任何重复? – Dmitri

+0

s /固定收藏/混合收藏/ – Dmitri