关于Node
接口的另一种思考方式是实现它的对象是refetchable。可重用性有效地意味着一个对象有一个ID可以用来识别对象并检索它;按照惯例,这些ID通常是不透明的,但是将包含类型信息和该类型中的标识符(例如像“Account:1234”这样的字符串的Base-64编码)。
接力将在两个方面发挥refetchability:
- 在被称为“版本比较”,如果您已经有通过ID
QWNjb3VudDoxMjM0
标识的对象的一些数据的过程(比如,在name
和address
字段),然后导航到显示其他字段(location
,createdAt
)的视图,然后中继可以创建一个“重新提交”该节点的最小查询,但仅请求缺少的字段。
- 与此相关,Relay将会区分连接并将利用接口填写这些数据的缺失数据(例如:通过导航的某种组合,您可能在某个视图中有一些项目的完整信息,但需要填写
location
对于范围内的某些项目,或者您可以通过突变修改连接中的项目)。因此,在基本分页中,Relay通常会最终制作一个first
+ after
查询来扩展连接,但是如果您在真实应用程序中检查其网络流量,您还会看到它会对连接中的项目进行node
查询。
所以,是的,你说得对,pageInfo
没有实现Node
,一下子就没有真正意义它这样做。
也就是说:没有*需要*来实现'Node',但是那些对象会被更有效地处理?我现在看到https://facebook.github.io/relay/graphql/connections.htm提到“如果此字段返回一个实现Node的对象,Relay可以执行某些优化,但是,这不是使用Relay的严格要求“。 – Evan
正确。我不想过于强硬,但一个好的经验法则可能是将其用于业务领域中的“核心”对象,尤其是那些可以通过顶级路线导航的对象,以及它们出现在连接中。最佳方法当然会因应用而异,但如果您可以便宜地实施'Node'(并且您经常可以),那么至少在我上面提到的那些情况下,您可能会从中受益。 – wincent