#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)
);
},
},
});
},
});