7

我对 Apollo Stack 和 Relay 都很陌生。我试图在它们之间做出选择来投资我的时间。读完《Learning GraphQL and Relay 》这本书后,我转向 Apollo 来了解它提供的内容,但现在互联网上的资源并不多。

我最近有这个问题但找不到答案:Apollo 是否像 Relay 一样支持全局对象识别与节点接口?如果没有,它是否有任何替代解决方案来支持全局对象识别?

4

2 回答 2

11

是的

它当前的工作方式(版本 0.5 apollo-client)是使用构造函数接受的dataIdFromObject函数。ApolloClient

如果所有节点都有一个id字段并且它们在所有节点中都是唯一的(例如,在 Graphcool,我们使用这个库生成唯一的 id ):

import ApolloClient from 'apollo-client';

const client = new ApolloClient({
  dataIdFromObject: o => o.id
});

您必须确保id在要规范化的每个查询中都包含该字段。

如果您的 id 仅每种类型唯一,您可以将它们与__typename创建唯一标识符结合使用:

const client = new ApolloClient({
  dataIdFromObject: (result) => {
    if (result.id && result.__typename) {
      return result.__typename + result.id;
    }

    // Make sure to return null if this object doesn't have an ID
    return null;
  },
});

代码取自Apollo 官方文档

于 2016-12-08T16:11:18.610 回答
2

apollo-clientv2 中,您必须改为传递dataIdFromObjectInMemoryCache实例。

import { InMemoryCache } from 'apollo-cache-inmemory';
import { HttpLink } from 'apollo-link-http';
import ApolloClient from 'apollo-client';

const client = new ApolloClient({
  link: new HttpLink(),
  cache: new InMemoryCache({
    dataIdFromObject: object => object.id,
  }),
});
于 2018-07-11T13:41:00.957 回答