@relay 的目的(模式:真)
Posted
技术标签:
【中文标题】@relay 的目的(模式:真)【英文标题】:Purpose of @relay(pattern:true) 【发布时间】:2016-03-10 06:26:57 【问题描述】:change log 中为 relay.js
0.5
引入了新表达式 @relay(pattern: true)
。
但无法从描述中弄清楚,也无法测试它究竟做了什么以及在编写fatQueries
时应该何时使用它。
一些例子会很有帮助。
【问题讨论】:
【参考方案1】:考虑如下所示的 GraphQL 查询:
viewer
friends(first: 10)
totalCount
edges node name
pageInfo hasNextPage
在为 Relay 突变定义 fat query 时,包含字段名称而不指定其任何子字段会告诉 Relay,该字段的任何子字段都可能因该突变而发生变化.
不幸的是,在friends
字段上省略find
、first
和last
等连接参数将导致连接参数相关字段edges
和pageInfo
出现验证错误:
getFatQuery()
return Relay.QL`
fragment on AddFriendMutationPayload
viewer
friends edges, pageInfo # Will throw the validation error below
`;
// Uncaught Error: GraphQL validation/transform error ``You supplied the `pageInfo`
// field on a connection named `friends`, but you did not supply an argument necessary
// to do so. Use either the `find`, `first`, or `last` argument.`` in file
// `/path/to/MyMutation.js`.
您可以使用@relay(pattern: true)
指令来指示要使用胖查询来对跟踪的查询进行模式匹配,而不是将其用作完整的查询。
getFatQuery()
return Relay.QL`
fragment on AddFriendMutationPayload @relay(pattern: true)
viewer
friends edges, pageInfo # Valid!
`;
有关突变的更多信息,请参阅:https://facebook.github.io/relay/docs/guides-mutations.html#content
【讨论】:
嗯...我以为这是自动发生的。引用上述文档链接:This fat query looks like any other GraphQL query, with one important distinction. We know some of these fields to be non-scalar (like friendEdge and friends) but notice that we have not named any of their children by way of a subquery. In this way, we indicate to Relay that anything under those non-scalar fields may change as a result of this mutation.
嗯。我也写了那些文档。我将不得不在这个问题上给朋友打电话。 @JoeSavona,是模式指令的用途是什么?
给朋友打了电话。编辑我的答案!
我们将不得不更新突变指南。 github.com/facebook/relay/issues/647
我上一个问题github.com/facebook/relay/issues/1300和github.com/facebook/relay/pull/1376的答案以上是关于@relay 的目的(模式:真)的主要内容,如果未能解决你的问题,请参考以下文章
带有 Relay-GraphQL 突变的撤销-重做状态遍历模式