Обновление кэша на клиенте Apollo с помощью writeQuery()

#caching #react-hooks #updates #apollo-client

Вопрос:

не дубликат Я просматривал документацию и много читал о подобных проблемах, но я не нашел ответа на свой.

Проблема: я НЕ получаю никакого ответа от writeQuery в console.log(), и кэш НЕ обновляется после завершения мутации. Я смог зарегистрировать все, кроме результатов кэширования.writeQuery(), однако я не могу этого понять. Может ли кто-нибудь указать мне, где я иду не так и как это исправить?

Что я пытаюсь сделать: удалите (путем мутации) удаленный объект из кэша, заменив предыдущие данные новыми данными, из которых удаляется объект. И сохраните обновленный кэш!

Запрос категории товаров:

 const GET_CATEGORIES_AND_PRODUCTS = gql`
    query GetProductcategories($site_id: ID!, $first: Int!, $page: Int!, $orderBy: [OrderByClause!]){
        productcategories(site_id: $site_id, first: $first, page: $page, orderBy: $orderBy ){
            paginatorInfo{
                count
                total
            }
            data {
            name
            categorie_id
            }
        }
    }
`
 

Запрос категорий продуктов КЭША:

 $ROOT_QUERY.productcategories({"first":10,"orderBy":[{"field":"categorie_id","order":"DESC"}],"page":1,"site_id":"152"})
paginatorInfo: {} 4 keys
data: { 10 keys
  0: {} 4 keys
     type:"id"
     generated:true
     id:"$ROOT_QUERY.productcategories({"first":10,"orderBy": 
[{"field":"categorie_id","order":"DESC"}],"page":1,"site_id":"152"}).data.0"
     typename:"ProductCategory"
  1: {} 4 keys
  2: {} 4 keys
  3: {} 4 keys
  4: {} 4 keys
  5: {} 4 keys
  6: {} 4 keys
  7: {} 4 keys
  8: {} 4 keys
  9: {} 4 keys
__typename:"ProductCategoryPaginator"
 

Мутация категории удаления:

 const [deleteCategorie, { loading, error }] = useMutation(DELETE_CATEGORIE, {
            update: (cache, deleteCategorie) => {
                const idToRemove = deleteCategorie.data.deleteCategorie.categorie_id;
                const existingData = cache.readQuery({ 
                    query: GET_CATEGORIES_AND_PRODUCTS, 
                    variables: { 
                        site_id: localStorage.getItem("site_id"),
                        page: (page   1),
                        first: rowsPerPage,
                        orderBy: [order],
                  }, });
                const deletedObject = existingData.productcategories.data.find((t) => (t.categorie_id === idToRemove));
                const newCats = existingData.productcategories.data.filter((t) => (t.categorie_id !== idToRemove));
                console.log(cache.writeQuery({
                    query: GET_CATEGORIES_AND_PRODUCTS,
                    variables: { 
                        site_id: localStorage.getItem("site_id"),
                        page: (page   1),
                        first: rowsPerPage,
                        orderBy: [order],
                    },
                    data: {
                        productcategories: {
                            data: [
                                ...newCats
                            ]
                        }
                    }
                }));
            }
        });
 

Любая помощь приветствуется, это первый раз, когда я пытаюсь обновить кэш!

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

1. Вы пробовали регистрировать новичков? Действительно ли это удаление удаленной категории из списка?

2. @mfurkangok, спасибо вам за ваш ответ. Я успешно зарегистрировал newCats, и в нем, как и ожидалось, осталось 9 объектов. Я смог зарегистрировать все, кроме результатов кэширования. writeQuery().

Ответ №1:

Я исправил эту проблему. Мне пришлось добавить ключевое поле для ProductCategory в typePolicies, потому что оно искало «идентификатор», которого нет у этих объектов.

Также у меня было несколько старых пакетов, таких как @apollo/react-хуки, которые каким-то образом вмешивались в кэширование. Для получения дополнительной информации обратитесь за справкой по обновлению в de docs.

 cache: new InMemoryCache({
        typePolicies: {
            ProductCategory: {
                keyFields: ['categorie_id']
            },
        },
   })
 

Более подробную информацию об этом и о кэшировании можно найти в одном из блогов apollo:
https://www.apollographql.com/блог/apollo-клиент/кэширование/демистификация-нормализация кэша/