我对 Apollo Stack 和 Relay 都很陌生。我试图在它们之间做出选择来投资我的时间。读完《Learning GraphQL and Relay 》这本书后,我转向 Apollo 来了解它提供的内容,但现在互联网上的资源并不多。
我最近有这个问题但找不到答案:Apollo 是否像 Relay 一样支持全局对象识别与节点接口?如果没有,它是否有任何替代解决方案来支持全局对象识别?
我对 Apollo Stack 和 Relay 都很陌生。我试图在它们之间做出选择来投资我的时间。读完《Learning GraphQL and Relay 》这本书后,我转向 Apollo 来了解它提供的内容,但现在互联网上的资源并不多。
我最近有这个问题但找不到答案:Apollo 是否像 Relay 一样支持全局对象识别与节点接口?如果没有,它是否有任何替代解决方案来支持全局对象识别?
是的!
它当前的工作方式(版本 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 官方文档。
在apollo-client
v2 中,您必须改为传递dataIdFromObject
给InMemoryCache
实例。
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,
}),
});