С клиентом Apollo React, почему вам не всегда нужен распознаватель для разрешения запросов @client GraphQL? - PullRequest
1 голос
/ 02 мая 2019

Я изучаю, как использовать Apollo Client для React и как управлять локальным состоянием с помощью кэша.Из docs это так же просто, как запись в кэш с использованием cache.writeData и чтение из него с помощью простого запроса.Их пример:

const GET_VISIBILITY_FILTER = gql`
  {
    visibilityFilter @client
  }
`;

Затем я обертываю свой JSX в запрос и могу прочитать значение отлично (в моем случае loggedIn)

 return <Query query={GET_LOGGED_IN}>
      {({loading, error, data}) => {

        const {loggedIn} = data

Мне любопытно, хотя,почему мне не нужно писать решатель для этого, чтобы работать.Это потому, что со скалярными значениями, если значение существует в корне объекта, то есть здесь, на верхнем уровне кэша, Apollo / GraphQL автоматически просто захватывает это значение и отправляет его вам без распознавателя?

Каковы ограничения этого, то есть, вы могли бы получить массивы на корневом уровне без написания резольвера?Объекты?Я предполагаю, что нет, , поскольку это не скаляры .Но если данные жестко запрограммированы, то есть не требуют поиска в БД, ответ все равно будет «нет»?

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Из документов :

[Директива @client] сообщает клиенту Apollo, что нужно извлекать данные поля локально (либо из кэша, либо с помощью локального преобразователя), вместо этогоотправки его на наш сервер GraphQL.

Если в поле присутствует директива, Apollo попытается разрешить поле с помощью предоставленного преобразователя или возвратится к выборке непосредственно из кэша, еслине существуетВы можете инициализировать кэш практически любым типом данных на корневом уровне (стараясь включить __typename поля для объектов), и вы сможете получить его, не предоставляя также resolver для него.С другой стороны, обеспечение распознавателя может предоставить вам более детальный контроль над тем, что фактически извлекается из кэша - то есть вы можете инициализировать кэш массивом элементов, но использовать средство распознавания, чтобы обеспечить способ их фильтрации или сортировки.

Здесь есть нюанс импорта: выборка без распознавателя только работает, когда в кеше есть данные для выборки.Вот почему важно предоставить начальное состояние для этих полей при построении вашего клиента.Если у вас есть более глубоко вложенное поле @client (например, возможно, вы включаете дополнительную информацию вместе с данными, полученными с сервера), вам также технически не нужно писать преобразователь.Но мы обычно пишем их, потому что для этих вложенных полей в кеше нет данных.

1 голос
/ 02 мая 2019

В дополнение к отличному (как обычно) ответу от Даниэля, я хотел бы добавить несколько слов.

Вы можете использовать (чтение / запись) объекты для кеширования и манипулирования его свойствами напрямую.

Использование распознавателей и мутаций для локальных данных может помочь с удобочитаемостью, доступом к данным / унификацией изменений, общей управляемостью или будущими изменениями (перенести функцию / настройки на сервер).

Более практичный / расширенный пример локального состоянияруководство вы можете найти в apollo-universal-starter-kit project.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...