Как удалить запись кэша из клиента Apollo GraphQL с помощью readQuery и writeQuery

#apollo #react-apollo #apollo-client #apollostack #react-apollo-hooks

#apollo #реагировать-apollo #apollo-client #apollostack #реагировать-apollo-hooks

Вопрос:

Команда Apollo GraphQL утверждает, что readQuery и writeQuery подходят для 95% случаев использования. Я использую useMutation и update и хочу удалить элемент из кэша без необходимости вызова refetchQueries . Мой код выглядит следующим образом:

 const [deleteSpeaker] = useMutation(DELETE_SPEAKER, {
  update(cache, { data: {deleteSpeaker}}) {
    const { speakers} = cache.readQuery({query: GET_SPEAKERS});
    cache.writeQuery({
      query: GET_SPEAKERS,
      data: { speakers: speakers.filter(speaker => speaker.id !== deleteSpeaker.id) }
    });
  },
});
  

То, что возвращается из readQuery, наводит меня на мысль, что я должен фильтровать speakers.datalist, но когда я это делаю, кэш не обновляется.

Как правильно обновить кэш, чтобы отразить удаленную запись из запроса GET_SPEAKERS.

 export const DELETE_SPEAKER = gql`
      mutation DeleteSpeaker($speakerId: Int!) {
        deleteSpeaker(speakerId: $speakerId) {
          id
          first
          last
          favorite
        }
      }
    `;
  

и GET_SPEAKERS

 export const GET_SPEAKERS = gql`
  query {
    speakers {
      datalist {
        id
        first
        last
        favorite
        company
      }
    }
  }
`;
  

Комментарии:

1. Фильтр speakers.datalist

2. просто консоль. считайте значение / структуру журнала из кэша и создавайте новый объект с новым отфильтрованным содержимым внутри «неизменяемым способом»

Ответ №1:

читая документы apollo, это должно быть что-то вроде:

 const [deleteSpeaker] = useMutation(DELETE_SPEAKER, {
  update(cache, { data: {deleteSpeaker}}) {
    cache.modify({
      id: cache.identify(deleteSpeaker.id),
      fields: {
        comments(existingSpeakerRefs, { readField }) {
          return existingSpeakerRefs.filter(
            speaker => deleteSpeaker.id !== readField('id', speakerRef)
          );
        },
      },
    });
  },
});