Как преобразовать клиент apollo fetchMore updateQuery в функцию слияния кэша apollo?

#graphql #apollo #react-apollo #apollo-client

#graphql #apollo #реагировать-apollo #apollo-client

Вопрос:

Я изучаю apollo и GraphQL, и у меня есть простое приложение, которое отображает список данных с функцией fetchMore, которая добавляет к массиву.

Я хотел бы удалить updateQuery, поскольку он устарел, и использовать новую функцию слияния политики полей. Текущая настройка кэша и updateQuery выглядит следующим образом:

 const cache = new InMemoryCache({
  typePolicies: {
    client_client: {
      fields: {
        // add local only value to clients
        isEdited: {
          read(value = false) {
            // when writing the new value return new value or false as default
            return value;
          },
        }
      }
    }
  }
});
  
   const onFetchMore = () => {
    fetchMore({
      variables: {
        offset: page
      },
      updateQuery: (previousResult, { fetchMoreResult, queryVariables }) => {
        return {
          ...previousResult,
          client_client: [
            ...previousResult.client_client,
            ...fetchMoreResult.client_client,
          ],
        };
      },
    });
  }
  

Однако, похоже, я не могу заставить его работать как функция слияния в кэше для apollo client v3. Я пытался добавить слияние во многих разных местах, однако, кажется, что это всегда приводит к сбою приложения.

Буду признателен за любую помощь в том, как это сделать.

Ответ №1:

Согласно документам, определите политику полей в typePolicies опции, предоставленной в InMemoryCache конструкторе:

 const cache = new InMemoryCache({   typePolicies: {
    Query: {
      fields: {
        feed: {
          // Don't cache separate results based on
          // any of this field's arguments.
          keyArgs: false,
          // Concatenate the incoming list items with
          // the existing list items.
          merge(existing = [], incoming) {
            return [...existing, ...incoming];
          },
        }
      }
    }   } })
  

Затем вы просто передаете offset и limit в начальный запрос:

 const { loading, data, fetchMore } = useQuery(GET_ITEMS, {
  variables: {
    offset: 0,
    limit: 10
  },
});
  

и fetchMore для получения следующей итерации:

 fetchMore({
  variables: {
    offset: 10,
    limit: 10
  },
});
  

Ознакомьтесь с документами здесь:https://www.apollographql.com/docs/react/pagination/core-api

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

1. откуда вы получаете значение полей: ‘feed’?

2. @Steve поля — это карта, которая определяет функцию-модификатор, вызываемую для каждого измененного поля. Итак, «feed» здесь — это поле запроса, возвращаемое запросом graphql, то есть ... query Feed($offset: Int, $limit: Int) { feed(offset: $offset, limit: $limit) { ...