Как получить содержимое кэша клиента apollo и использовать его в запросе в качестве типа ввода? - PullRequest
1 голос
/ 16 октября 2019

Я занимаюсь разработкой собственного приложения с клиентом apollo, и мне нужно иметь 2 экрана: Экран A: отображает список профилей Экран B: отображает некоторые фильтры, которые необходимо применить к экрану A

Моя идея состояла в том, чтобы использовать клиентский кеш apollo, чтобы сохранить состояние фильтров на экране B, а затем вернуться на экран A и каким-то образом повторно выполнить с новыми примененными фильтрами.

Так как есть несколько фильтров, которые янеобходимо отправлять каждый запрос на сервер, я также думал об использовании типа ввода, чтобы я мог отправлять свои фильтры в виде объекта вместо списка параметров, разделенных запятыми.

Итак, глядя наДокументы от клиента Apollo, есть раздел для управления локальной сценой. Там я обнаружил подраздел под названием Использование полей @client в качестве переменных . По сути, эта часть рассказывает, как захватить фильтры, которые были сохранены в кэше, и отправить их как часть запроса.

Однако всегда возникает следующая ошибка: Нарушение инварианта: отсутствует выбор дляобъект типа ProfileParameters, возвращаемый для поля запросасодержат больше параметров.

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

cache.writeData({
  data: {
    profileParameters: {
      __typename: 'ProfileParameters',
      page: 0,
      pageSize: 25,
    },
  },
});

const client = new ApolloClient({
  uri: 'http://192.168.1.102:3000/graphql',
  cache: cache,
  resolvers: {},
});

И это компонент запроса и запрос:

const PROFILES_QUERY = gql`
      query getFilteredProfiles($type: String, $parameters: ProfileParameters) {
        profileParameters @client @export(as: "parameters")
        profiles(type: $type, parameters: $parameters) {
          id
          name
          termOfEntry
          sport
          sportPosition
          gpa
          avatarUrl
          imageUrl
          nationality
          countryOfResidence
          dateOfBirth
          annualBudget
          career
          satScore
          toeflScore
          graduationDate
        }
      }
    `;
          <Query
            query={PROFILES_QUERY}
            variables={{
              type: this.PROFILE_TYPE,
            }}> 
               ...
          </Query>

Существует переменная type , которая передается в переменныеобъект. Это происходит из локальной переменной в классе.

Кроме того, экран B еще не существует, но кэш инициализируется, и я хочу прочитать все, что там есть, чтобы я мог отправить эти фильтры на сервер.

...