Повторное использование данных, кэшированных из одного запроса в другом - PullRequest
0 голосов
/ 04 марта 2019

Учитывая простую схему graphql, которая выглядит примерно так:

type Contact {
    id: ID!
    name: String
}

type Query {
    RecentContacts: [Contact]
    Contact(id: ID!): Contact
}

Если я запрашиваю Недавние контакты:

const GET_RECENT_CONTACTS = gql`
    query RecentContacts {
        RecentContacts {
          id
          name
        }
    }`

<Query client={client} query={GET_RECENT_CONTACTS}>
    {({loading, error, data}) => { /* etc... */ }}
</Query>

И получаю данные, например, о контактах с идентификаторами 1 и 2, которыекэшируется как:

ROOT_QUERY
    RecentContacts: [Contact]
        0:  Contact:1
              id: 1
              name: Jack
        1:  Contact:2
              id: 2
              name: Jill

Есть ли способ сообщить Аполлону, что он может использовать уже кэшированные записи для запросов Contact(id: 1) и Contact(id: 2) без необходимости делать другой сетевой запрос просто для возвратаданные, которые уже существуют в кэше?

В частности, я бы хотел, чтобы этот запрос не выполнял сетевой запрос после запроса RecentContacts, поскольку необходимые ему данные уже находятся в кэше (хотявозвращается из вызова на другой запрос):

const GET_CONTACT = gql`
    query Contact($id: ID!){
        Contact(id: $id){
          id
          name
        }
    }

<Query client={client} query={GET_CONTACT} variables={{id: 1}}>
    {({loading, error, data}) => {/* etc... */}}
</Query>

1 Ответ

0 голосов
/ 05 марта 2019

Вы можете использовать перенаправление кеша , чтобы сделать это.Вот пример из документов, измененных для работы с вашей схемой:

import { InMemoryCache } from 'apollo-cache-inmemory';

const cache = new InMemoryCache({
  cacheRedirects: {
    Query: {
      User: (_, args, { getCacheKey }) =>
        getCacheKey({ __typename: 'User', id: args.id })
    },
  },
});
...