Удаление кеша клиента Apollo для заданного запроса и каждого набора переменных
У меня есть отфильтрованный список элементов на getAllItems
запроса getAllItems
, который в качестве аргументов принимает фильтр и порядок по параметрам.
После создания нового элемента я хочу удалить кеш для этого запроса, независимо от того, какие переменные были переданы. Я не знаю, как это сделать.
Я не думаю, что обновление кеша является опцией. Методы, упомянутые в документации клиента Apollo (обновление кеша после мутации, refetchQueries и обновления), похоже, нуждаются в заданном наборе переменных, но поскольку фильтр является сложным объектом (с некоторой текстовой информацией), мне нужно будет обновить кеш для каждого заданного набора переменных, которые были ранее отправлены. Я не знаю, как это сделать. Кроме того, только сервер знает, как этот новый элемент влияет на разбиение на страницы и упорядочение.
Я не думаю, что выборка-политика (например, установка ее в cache-and-network
) - это то, что я ищу, потому что если доступ к сети - это то, что я хочу, создав новый элемент, когда я просто фильтрую список (введите строку для поиска), я хочу остаться с поведением по умолчанию (cache-only
).
client.resetStore
сбрасывает хранилище для всех типов запросов (не только запроса getAllItems
), поэтому я не думаю, что это то, что я ищу.
Я почти уверен, что здесь что-то не хватает.
Ответы
Ответ 1
Официально не поддерживается способ сделать это в текущей версии Apollo, но есть обходной путь.
В вашей функции обновления после создания элемента вы можете перебирать кеш и удалять все узлы, где ключ начинается с имени типа, которое вы пытаетесь удалить из кеша. например
// Loop through all the data in our cache
// And delete any items where the key start with "Item"
// This empties the cache of all of our items and
// forces a refetch of the data only when it is next requested.
Object.keys(cache.data.data).forEach(key =>
key.match(/^Item/) && cache.data.delete(key)
)
Ответ 2
как ngrx
resolvers = {
removeTask(
parent,
{ id },
{ cache, getCacheKey }: { cache: InMemoryCache | any; getCacheKey: any }
) {
const key = getCacheKey({ __typename: "Task", id });
const { [key]: deleted, ...data } = cache.data.data;
cache.data.data = { ...data };
return id;
}
}