Удаление кеша клиента 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;
     }
}