Чтение запроса из кэша Apollo с запросом, который еще не существует, но в котором уже хранится вся информация - PullRequest
0 голосов
/ 10 октября 2018

У меня есть конечная точка graphql, в которую можно ввести этот запрос:

fragment ChildParts {
  id
  __typename
}

fragment ParentParts {
  __typename
  id
    children {
   edges{
       node {
         ...ChildParts 
       }
   }
}

query {
  parents {
    edges
      nodes {
        ...ParentParts
      }
    }
  }
}

При выполнении он возвращает что-то вроде этого:

"data": {
  "edges": [
     "node": {
       "id": "<some id for parent>",
       "__typename": "ParentNode",
       "children": {
         "edges": [
           node: {
             "id": "<some id for child>",
             "__typename": "ChildNode"
           },
           ...
         ]
       }
     },
     ...   
  ]
}

Теперь, с клиентом apollo, послемутация, я могу прочитать этот запрос из кэша и обновить / добавить / удалить любой ParentNode, а также любой ChildNode, но мне нужно просмотреть структуру, возвращаемую этим запросом.

Теперь я ищудля возможности получить список дочерних узлов из кэша (который уже есть, так как кеш создается как плоский список), чтобы немного упростить обновление вложенных данных.Есть ли возможность прочитать запрос из кэша, не прочитав тот же запрос с сервера раньше?

1 Ответ

0 голосов
/ 11 октября 2018

Вы можете использовать клиентский метод readFragment для извлечения любого отдельного элемента из кэша.Для этого просто требуется идентификатор и строка фрагмента.

const todo = client.readFragment({
  id,
  fragment: gql`
    fragment fooFragment on Foo {
      id
      bar
      qax
    }
  `,
})

Обратите внимание, что id здесь - это ключ кеша, возвращаемый функцией dataIdFromObject - если вы не указали пользовательскую функцию, то (при условииполя __typename и id или _id присутствуют) реализация по умолчанию просто:

${result.__typename}:${result.id || result._id}

Если вы предоставили свою собственную функцию dataIdFromObject, вам нужно будет указать любой идентификатор, возвращаемый этой функцией.

Как указывал @Herku, в зависимости от варианта использования также возможно использовать перенаправления кеша для использования данных, кэшированных для одного запроса, при разрешении другого.Это настроено как часть настройки вашего InMemoryCache:

const cache = new InMemoryCache({
  cacheRedirects: {
    Query: {
      book: (_, args, { getCacheKey }) =>
        getCacheKey({ __typename: 'Book', id: args.id })
    },
  },
})

К сожалению, на момент написания этого ответа я не думаю, что есть какой-либо способ удалить кэшированный элемент по идентификатору.Здесь идет обсуждение здесь по этому вопросу (оригинальный выпуск здесь ).

...