中继:根据父查询的结果参数化 getFragment
Posted
技术标签:
【中文标题】中继:根据父查询的结果参数化 getFragment【英文标题】:Relay: Parametrize getFragment based on results of a parent query 【发布时间】:2016-08-09 03:14:37 【问题描述】:我的 CMS 向我返回一个节点列表,每个节点都有自己的节点类型。对于每个节点类型,我定义了一个对应的 GraphQL 类型。
type getContent
content: [ContentNode]
我想要这样的查询:
content
contentType
properties
$ContentType.getFragment('content', type: $contentType???)
ContentType 将根据提供给它的类型变量返回正确的片段定义。但是如何从父结果中获取$contentType
?
【问题讨论】:
【参考方案1】:您不能拥有依赖于父级实际值的片段,因为片段是在实际向服务器发出查询请求之前组成的。有两种不同的方法来处理这个问题,一种是让片段根据变量而变化,另一种是在组件中使用接口和类型化片段。
这是一个很好的答案,展示了使用变量的示例: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
【讨论】:
非常感谢您的精彩回复。我将尝试探索您的接口解决方案,到目前为止看起来很有希望,并且一旦我最终得到它,就会将您的答案标记为已接受。 条件片段对我不起作用,因为路由信息不包含我正在渲染的元素类型(因为这可能是元素的固定集合)。但是您的第二种方法似乎真的很酷。但是有一个问题:当像... on ContentNode1
那样做某事时,这个片段是否只包含在这种类型中?所以不会有任何重复的信息返回?
s/固定收藏/混合收藏/
@Dmitry:信息重复是什么意思?一种类型只能是某个接口的一种实现,如果这是您所要求的。
是的,这就是我的意思。我需要尝试更多地尝试,但我认为这正是我所需要的,因此接受答案。谢谢!以上是关于中继:根据父查询的结果参数化 getFragment的主要内容,如果未能解决你的问题,请参考以下文章
如何避免从 C# 构建的 Sql Server 2005 参数化查询变慢