2016-01-22 56 views
3

https://facebook.github.io/relay/graphql/objectidentification.htm对于Node是什么以及它如何表现非常清楚,但它没有指定哪些对象必须实现它,或者如果对象没有实现它会产生什么后果。是否有一组功能不起作用?这些物体是否完全被忽略?并非现有规范中的所有对象(例如pageInfo)都实现它,因此它显然不是普遍需要的,但pageInfo有些特殊情况。哪些中继对象必须实现`Node`?

回答

2

关于Node接口的另一种思考方式是实现它的对象是refetchable。可重用性有效地意味着一个对象有一个ID可以用来识别对象并检索它;按照惯例,这些ID通常是不透明的,但是将包含类型信息和该类型中的标识符(例如像“Account:1234”这样的字符串的Base-64编码)。

接力将在两个方面发挥refetchability:

  • 在被称为“版本比较”,如果您已经有通过ID QWNjb3VudDoxMjM0标识的对象的一些数据的过程(比如,在nameaddress字段),然后导航到显示其他字段(location,createdAt)的视图,然后中继可以创建一个“重新提交”该节点的最小查询,但仅请求缺少的字段。
  • 与此相关,Relay将会区分连接并将利用接口填写这些数据的缺失数据(例如:通过导航的某种组合,您可能在某个视图中有一些项目的完整信息,但需要填写location对于范围内的某些项目,或者您可以通过突变修改连接中的项目)。因此,在基本分页中,Relay通常会最终制作一个first + after查询来扩展连接,但是如果您在真实应用程序中检查其网络流量,您还会看到它会对连接中的项目进行node查询。

所以,是的,你说得对,pageInfo没有实现Node,一下子就没有真正意义它这样做。

+0

也就是说:没有*需要*来实现'Node',但是那些对象会被更有效地处理?我现在看到https://facebook.github.io/relay/graphql/connections.htm提到“如果此字段返回一个实现Node的对象,Relay可以执行某些优化,但是,这不是使用Relay的严格要求“。 – Evan

+0

正确。我不想过于强硬,但一个好的经验法则可能是将其用于业务领域中的“核心”对象,尤其是那些可以通过顶级路线导航的对象,以及它们出现在连接中。最佳方法当然会因应用而异,但如果您可以便宜地实施'Node'(并且您经常可以),那么至少在我上面提到的那些情况下,您可能会从中受益。 – wincent

相关问题