@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 字段上省略findfirstlast 等连接参数将导致连接参数相关字段edgespageInfo 出现验证错误:

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 的目的(模式:真)的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 和 Relay 中的模式之间的区别

带有 Relay-GraphQL 突变的撤销-重做状态遍历模式

单例模式,这个面试题真那么简单吗?

真·干货你务必要搞清楚的十大数据挖掘知识点

如何为 GraphQLObjectType 的 GraphQLList 定义 Relay 片段?

使用 Relay Mutation 的结果作为 Relay Container Prop