使用`setVariables`后中继生成无效查询-我做错了啥吗?
Posted
技术标签:
【中文标题】使用`setVariables`后中继生成无效查询-我做错了啥吗?【英文标题】:Relay generating invalid query after using `setVariables`-- am I doing something wrong?使用`setVariables`后中继生成无效查询-我做错了什么吗? 【发布时间】:2017-03-16 11:30:37 【问题描述】:由于某种原因,如果我在注入子组件之前生成一个根查询,它接受参数,如下所示:
import Relay from 'react-relay';
export default
production: (Component) => Relay.QL`
query
getProduction(id: $productionId)
$Component.getFragment('production')
`
;
Relay 最初生成这个查询:
query MyProductionDetailsQuery($id_0:ID!,$where_1:ProductionRoleWhereArgs!)
getProduction(id:$id_0)
id,
...F0
fragment F0 on Production
id,
...
_roles4oPiwv:roles(first:10,where:$where_1)
edges
node
id,
...
,
cursor
,
pageInfo
hasNextPage,
hasPreviousPage
变量:
id_0: "UHJvZHVjdGlvbjoxNg==", where_1: archived: eq: true
但是,如果组件的中继容器有自己的变量,运行this.props.relay.setVariables(...variables)
会将中继生成的请求查询完全改变成这样:
query My_production_details_page_ProductionRelayQL($id_0:ID!,$where_1:ProductionRoleWhereArgs!)
node(id:$id_0)
...F0
fragment F0 on Production
id,
_roles6J5gK:roles(first:10,where:$where_1)
edges
node
id,
...
,
cursor
,
pageInfo
hasNextPage,
hasPreviousPage
变量:
id_0: "UHJvZHVjdGlvbjoxNg==", where_1: archived: eq: false
但是,如果我有一个没有参数的根查询,setVariables 可以正常工作:
import Relay from 'react-relay';
export default
viewer: (Component, variables) => Relay.QL`
query
viewer
$Component.getFragment('viewer', ...variables )
`
;
这是生成的查询:
query ViewerQuery($where_0:ProductionWhereArgs!)
viewer
...F0
fragment F0 on Viewer
user
_productions2IPZAw:productions(first:10,where:$where_0)
edges
node
id,
...
,
cursor
,
pageInfo
hasNextPage,
hasPreviousPage
,
id
变量:
where_0: expDate: gt: "2016-11-04T16:29:11.677Z", archived: eq: false
在工作设置中的 setVariables 之后:
query ViewerQuery($where_0:ProductionWhereArgs!)
viewer
...F0
fragment F0 on Viewer
user
_productions1CyNvL:productions(first:10,where:$where_0)
edges
node
id,
...
,
cursor
,
pageInfo
hasNextPage,
hasPreviousPage
,
id
变量:
where_0: expDate: lt: "2016-11-04T16:34:12.537Z", archived: eq: false
版本:
"react-relay": "^0.9.3",
"react-router-relay": "^0.13.5"
我不确定我的配置是否有问题,或者这只是 Relay 端的错误。
有谁知道是什么导致了这个问题?
【问题讨论】:
为了提高您的问题质量,请描述您的问题并提出具体问题,而不是在其他地方提及。如需帮助,请参阅“How to Ask a Good Question”。 嗨,我很抱歉!我刚刚编辑了这篇文章,提供了更多信息。我希望我现在要问的更清楚一点。 【参考方案1】:当您运行 setVariables 时,它会导致仅重新获取必要的数据。 Relay 查看查询的哪一部分可能会受到更改变量的影响,并且来自 GraphQL 服务器的请求需要片段。 这是可能的,因为 Node 接口(即通过不透明的 Relay id 获取对象)。在documentation 中查看更多信息。
我认为,在您的情况下,您应该在 GraphQL 服务器上实现 Node Interface for Production 类型。
【讨论】:
我的生产类型确实实现了节点接口。奇怪的是,如果我通过查看器查询(根中没有参数),并且在子组件中有参数,Relay 会生成正确的查询。以上是关于使用`setVariables`后中继生成无效查询-我做错了啥吗?的主要内容,如果未能解决你的问题,请参考以下文章
删除时出现中继错误:RelayMutationQuery:胖查询中的字段名称无效
Android DataBinding不能自动生成ViewDataBinding类的解决方法
使用 this.props.relay.setVariables 时,Relay/Graphql 查询字段“node”而不是“viewer”