В дополнение к запросу, graphql
HOC принимает объект конфигурации в качестве второго параметра, который позволяет вам точно настроить поведение вашего запроса. Вы можете, например, определить fetchPolicy
, который определяет, как Apollo использует кеш. По умолчанию, при получении того же запроса, Apollo впервые подключается к серверу, а затем использует кэш для последующих вызовов (это называется cache-first
). Если вы хотите, чтобы ваш компонент всегда выполнял запрос при его монтировании, вы можете установить политику выборки на network-only
:
export default graphql(fetchFriendProfile, {
options: (props) => ({
fetchPolicy: 'network-only',
}),
})(withRouter(FriendProfile))
Подробнее о правилах получения вы можете прочитать здесь .
Тем не менее, вам не нужно менять политику извлечения для достижения желаемого поведения. Частично проблема заключается в том, что вы фактически жестко программируете ввод id
- вместо этого вы должны передавать любые динамические входные данные как переменные с каждым запросом. Это означает, что ваш запрос должен выглядеть примерно так:
# Note: the actual type for $id will have to match your schema!
query WhateverNameYouLike ($id: ID!){
fetchFriendPosts(id: $id) {
username
birthday
profile_picture
}
}
Затем вы можете передать свою переменную следующим образом:
export default graphql(fetchFriendProfile, {
options: (props) => ({
variables: {
id: window.location.pathname.split('/')[2],
},
}),
})(withRouter(FriendProfile))
Примечание: похоже, что вы также используете React Router, поэтому вы должны иметь возможность получить идентификатор из match.params
вместо того, чтобы анализировать местоположение самостоятельно. Подробнее здесь .
Наконец, важно понимать, что Apollo нормализует кэшируемые данные, и для этого он использует свойство id
(или _id
) данных. Поэтому, если вы хотите, чтобы поведение cache-first
работало должным образом, вам нужно либо: а) убедиться, что вы всегда запрашиваете поле id
в своих запросах, либо б) указать Apollo использовать другое поле, например id
, настраивая InMemoryCache
соответственно. Похоже, у вас уже есть поле идентификатора, поэтому достаточно просто изменить свой запрос, чтобы включить его:
query WhateverNameYouLike ($id: ID!){
fetchFriendPosts(id: $id) {
id
username
birthday
profile_picture
}
}
Вы можете узнать больше о нормализации кэша и о том, как использовать dataIdFromObject
для настройки поведения InMemoryCache по умолчанию здесь .