У меня есть список Item
любого типа. Я могу запросить все из них с 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
, который вы делали раньше. Если у него нет элемента с таким идентификатором, сделайтеrequest. "
Что-то похожее на это можно сделать, запросив items
в MainView.tsx
и пролистав результаты. Это может работать для псевдокода, но в реальном приложении все не так просто: кеш может быть пустым в некоторых случаях. Или не достаточно, чтобы удовлетворить обязательные поля. Это означает, что мы должны загружать все элементы, когда нам нужен только один.
При дальнейшем исследовании Apollo Link
выглядит многообещающе. Может быть возможно перехватить исходящие запросы. Будем расследовать завтра.