Я занимаюсь разработкой собственного приложения с клиентом 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 еще не существует, но кэш инициализируется, и я хочу прочитать все, что там есть, чтобы я мог отправить эти фильтры на сервер.