Я работаю с локальным состоянием и кэшем Клиента Apollo, и хотя я просмотрел документы (https://www.apollographql.com/docs/react/essentials/local-state), несколько учебников (например, https://www.robinwieruch.de/react-apollo-link-state-tutorial/) и посмотрел несколько примеров,Я немного сбит с толку. В дополнение к любому пониманию, которое вы могли бы предоставить с конкретными вопросами ниже, любые ссылки на хорошие дополнительные документы / ресурсы, чтобы поместить вещи в контекст, были бы очень признательны.
В частности,Я понимаю, как хранить локальные данные на стороне клиента и извлекать их, но я не вижу, как все интегрируется с данными, полученными с сервера и отправленными обратно на сервер.
Принимая простое приложение todo в качестве отправной точкиУ меня есть пара вопросов.
1) Если вы загружаете набор данных (в данном случае «задачи») с сервера с помощью запроса, какова связь между кэшированными данными и сервером?сторонние данные? То есть я получаю данные с помощью запроса, они автоматически сохраняются в кеше. Теперь, если я хочу получить эти данные локально и, скажем, изменить их (в этом случаеSE, добавить задачу или изменить ее), как мне это сделать?Я знаю, как сделать это для данных, которые я создал, но не для данных, которые я скачал, таких как, в данном случае, мой набор задач.Например, некоторые учебные пособия ссылаются на __typename
- в случае данных, загружаемых с сервера, что это будет за __typename
?И если бы я использовал readQuery
для получения данных, загруженных с сервера и сохраненных в кеше, какой запрос я бы использовал?То же самое я использовал для загрузки данных изначально?
2) Как только я изменил эти локальные данные (например, в случае задач, установив одну задачу как «завершенные») и записал их обратно в кэш с помощью writeData
, как это сделать?получить обратно на сервер, чтобы локальная копия и удаленная копия были синхронизированы?С мутацией?Поэтому я несу ответственность за хранение копии в локальном кэше и , отправляя ее на сервер двумя отдельными операциями?
3) Как я понимаю, если вы не укажете иначе, если высделав запрос от клиента Apollo, он сначала проверит, находятся ли запрошенные вами данные в кэше, иначе он вызовет сервер.Тогда зачем вам нужно @client
в примере кода , чтобы получить задание?Поскольку они не были загружены с сервера с помощью предыдущего запроса, а являются только локальными данными?
const GET_TODOS = gql`
{
todos @client {
id
completed
text
}
visibilityFilter @client
}
`;
Если они были фактически загружены с более ранним запросом, вы не можете просто использовать тот же запрос, которыйВы изначально использовали для получения данных с сервера, не помещая @client
, и если данные находятся в кэше, вы получите кэшированные данные?
4) Наконец, я читал, что клиент Apollo будет обновлять вещи автоматически - то есть, если вы отправите измененные данные на сервер (скажем, в нашем случае, модифицированный todo), клиент Apollo сделаетубедитесь, что этот фрагмент данных изменен в кеше, ссылаясь на него по идентификатору.Есть ли правила относительно того, когда это происходит, а когда нет?Если клиент Apollo синхронизирует данные с сервером с помощью идентификаторов, когда нам нужно обрабатывать его «вручную», как указано выше, а когда нет?
Спасибо за любые идеи и если у вас есть ссылки на другиедокументы, чем те, что указаны выше, или хороший учебник, я был бы благодарен