Я пытаюсь использовать кэш Apollo для локального управления состоянием, чтобы сохранить состояние формы, чтобы его можно было вернуть без очистки.
Возникла проблема, когда кэш обновляется, но последующие запросыв кеш возвращаются устаревшие данные.Я столкнулся с этой проблемой в компонентах React, использующих хук useQuery
, а также в Apollo DevTools, который я буду использовать для демонстрации ниже:
У меня есть эта мутация и запрос, заданные в моих резольверах (я использую Typescript):
const resolvers = {
Mutation: {
storeLetterDraft: (_root, args: { type: string, details: LetterSending }, { client, getCacheKey }) => {
const id = getCacheKey({
__typename: "LetterDraft",
id: args.type,
});
const data = { ...args.details };
client.writeFragment({
data,
id,
fragment: LETTER_SENDING_FRAGMENT,
});
},
},
Query: {
letterDraft: (_root, args: { type: string }, { client, getCacheKey }) => {
// I HAVE TRIED A DEBUGGER STATEMENT HERE
const id = getCacheKey({
__typename: "LetterDraft",
id: args.type,
});
return client.readFragment({
id,
fragment: LETTER_SENDING_FRAGMENT,
});
},
},
}
Мой фрагмент:
export const LETTER_SENDING_FRAGMENT = gql`
fragment DraftLetterSending on LetterDraft {
date
firstName
lastName
addressLine1
addressLine2
addressTown
addressCounty
addressPostcode
}
`;
Я инициализирую кэш с помощью:
cache.writeData({
data: {
letterDrafts: [{
__typename: "LetterDraft",
id: "CREATE",
addressCounty: "Northamptonshire",
addressLine1: "1 Watkin Terrace",
addressLine2: "",
addressPostcode: "NN1 3ER",
addressTown: "Northampton",
date: "2019-11-01",
firstName: "d",
lastName: "d",
}],
},
});
Моя мутация выглядит так:
export const storeCreateLetterSendingMutation = gql`
mutation StoreCreateLetterSending($details: LetterSending!) {
storeLetterDraft(type: "CREATE", details: $details) @client
}
`;
До мутации кэш в Apollo DevTools выглядит так, как и ожидалось:
И запрос возвращается, как и ожидалось:
После выполнения мутации кэш обновляется:
Однако при запускезапрос снова приводит к устаревшим данным:
Интересно, если я помещу оператор отладчика в приведенную выше часть (I HAVE TRIED A DEBUGGER STATEMENT HERE
), то кажется, чтораспознаватель запросов запускается в первый раз, но не во второй раз, поэтому кажется, что запрос кэшируется - даже если это кеш, который я обновляю!Поэтому я думаю, что проблема в том, что запрос не запускает распознаватель впоследствии.