【发布时间】:2019-11-06 20:42:53
【问题描述】:
我有一个Items 的列表,不管是什么类型。我可以使用query items 或query item(id) 查询所有这些。
我意识到阿波罗不知道会返回什么。它知道类型,但不知道确切的数据。也许有办法不提出额外的要求?将一个查询映射到另一个查询?
伪代码:
// somewhere in Menu.tsx (renders first)
let items = useQuery(GET_ITEMS);
return items.map(item => <MenuItemRepresenation item={item} />);
// meanwhile in apollo cache (de-normalized for readability):
{ ROOT_QUERY: {
items: [ // query name per schema
{ id: 1, data: {...}, __typename: "Item" },
{ id: 2, data: {...}, __typename: "Item" },
{ id: 3, data: {...}, __typename: "Item" },
]
}
}
// somewhere in MainView.tsx (renders afterwards)
let neededId = getNeededId(); // 2
let item = useQuery(GET_ITEM, { variables: { id: neededId } } );
return <MainViewRepresentation item={item} />;
这样的代码将执行两次提取。即使数据已经在缓存中。但似乎阿波罗在查询级别上思考。我想向它解释一下:“如果我进行item 查询,您需要查看您之前所做的items 查询。如果它没有具有该ID 的项目,请继续进行请求。”
可以通过在MainView.tsx 中查询items 并梳理结果来完成类似的操作。它可能适用于伪代码,但在真正的应用程序中并不是那么简单:缓存在某些情况下可能是空的。或不足以满足必填字段。这意味着当我们只需要一个项目时,我们必须加载所有项目。
经过进一步研究,Apollo Link 看起来很有希望。可能会拦截传出查询。明天再调查。
【问题讨论】:
-
不太清楚你在这里问什么。 GraphQL 是一种强类型语言。 Apollo 客户端将根据服务器返回的
__typename“知道”一个项目是什么。也许您可以编辑您的问题以更好地解释您的要求,最好包括一些代码或伪代码的 sn-ps 来说明您的观点。 -
@DanielRearden 嗨,按要求展开。
标签: reactjs graphql react-apollo apollo-client