react-apollo
предоставляет три способа прослушивания изменений в кэше: 1) компонент запроса , 2) graphql HOC и 3) прямой вызов watchQuery
используя клиента. Во всех трех случаях вы предоставляете какой-либо запрос и любые соответствующие параметры, и вы получаете способ первоначально получить этот запрос, а также прослушать его обновления.
Ключевым моментом здесь является то, что запросов , а не фрагментов являются предназначенными средствами для чтения кэша. Метод readFragment
предназначен только для удобного способа считывания кэша один раз (обычно в контексте изменения кэша после мутации) и не обеспечивает какой-либо реактивности.
Итак, нижняя строка, оберните ваши компоненты либо в компонент Query
, либо в graphql
HOC, и вы получите доступ к реквизитам, которые отражают результаты запроса в кеше, и которые будут обновляться при обновлении кеша (то же самое). способ connect
ред компонентов).
В этот момент в вашей голове может происходить пара вещей:
«Но мне не нужно делать еще один запрос к серверу!» Не беспокойтесь - по умолчанию Apollo запрашивает один и тот же запрос только один раз и использует кэш для всех последующих вызовов. Вы можете изменить это поведение, установив соответствующую политику извлечения для вашего запроса. Это включает в себя политику cache-only
, которая будет извлекать данные только из кэша (хотя для большинства случаев достаточно политики по умолчанию cache-first
).
«Но у меня нет запроса для работы!» Если вы пишете в кеш как средство сохранения некоторого произвольного состояния на стороне клиента, то вам следует использовать apollo-link-state для этого.
«Но мне не нужен весь результат запроса, только его часть!» В graphql
HOC предусмотрена функция props
, которую вы можете передать в конфигурацию, которая позволит вам преобразовать данные вашего запроса в любую форму, с которой вы хотите работать. Та же функциональность на самом деле не нужна при использовании шаблона рендеринга реквизита с компонентом Query
- вы можете просто напрямую манипулировать реквизитом рендеринга. В любом случае, было бы неплохо написать некоторые редукторы, которые вы можете использовать повторно в своем проекте, которые просто принимают возвращенные данные и преобразуют их в нужную вам форму. В последнем большом проекте, над которым я работал, была только та сторона клиента, и с ней все было намного проще.