Скажите apollo-client, что возвращается из X-запроса с Y-аргументами? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть список 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 выглядит многообещающе. Может быть возможно перехватить исходящие запросы. Будем расследовать завтра.

1 Ответ

0 голосов
/ 06 ноября 2019

Не бери в голову аполлон. То, что я искал, называется cacheRedirects. Это опция для ApolloClient или Cache конструктора.

cacheRedirects: {
  Query: {
    node: (_, args, { getCacheKey }) => {
      const cacheKey = getCacheKey({
        __typename: "Item",
        id: args.id,
      });

      return cacheKey;
    },
  },
},

Я бы ссылался на документацию, но она никогда не была стабильной. Я видел слишком много мертвых ссылок на такие вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...