Как сопоставлять запросы с refetchQuery от Apollo

Мой основной вопрос заключается в том, должны ли переменные для запросов быть точными для работы refetchQueries. Или вы можете дать ему подмножество переменных, и он будет соответствовать похожим запросам.

Рассмотрим следующее....

  <Query<NotesQuery, NotesQueryVariables>
      query = {notesQuery}
      variables = {{
        input: {
          notebookId: notebookContext.id,
          first: 20
        }
      }}
    >
</Query>

и следующая мутация:

    client
      .mutate<NoteCreateOrUpdateMutation, NoteCreateOrUpdateMutationVariables>({
        mutation: noteCreateOrUpdateMutation,
        variables: {
          input: {
            noteId: note ? note.id : undefined,
            subjectIds: noteSubjects,
            notebookId: notebookContext.id,
            authorId: userContext.id,
            content: noteContent,
            context: noteCaption,
          }
        },
        refetchQueries: [
          {
            query: notesQuery,
            variables: { input: { notebookId: notebookContext.id } } as NotesQueryVariables
          }
        ]
      })

когда я делаю эту мутацию, она НЕ обновляет запрос заметки с нумерацией страниц

Если я добавлю параметр first: 20 -- он сработает.

Я хотел бы очистить все noteQueries, которые соответствуют заданным параметрам. Это возможно?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
1
0
378
1

Ответы 1

Я полагаю, вы захотите добавить @connection директивы к своим gql определениям notesQuery и measurementsQuery. Вы не опубликовали их, поэтому, к сожалению, я не могу показать вам, как именно это будет выглядеть для вашего варианта использования.

В любом случае, директива @connection позволит Apollo сопоставлять, например, notebookId, игнорируя при этом значение first.

К сожалению, вы упаковали весь свой ввод в объект input, и я не знаю, как вы могли бы выбрать только notebookId с помощью фильтра. Предполагая, что ваше определение gql выглядит примерно так для notesQuery:

const notesQuery = gql`
  query notes($input: InputType!) {
    notes(input: $input) @connection(key: "notes", filter: ["input['notebookId']"]) {
      id
      ...
    }
  }
`;

^^^ К сожалению, это не сработает из-за того, как работает функция apollo-utilities/lib/storeUtils.js -> getStoreKeyName(). Он просто проигнорирует приведенную выше попытку получить лучшее разрешение, чем имя аргумента, т.е. не может выйти за пределы input. Любая строка в массиве фильтров, которая не соответствует имени аргумента, игнорируется.

Похоже, вам придется изменить вашу схему.

Дополнительная информация: https://www.apollographql.com/docs/react/features/pagination.html#connection-directive

Другие вопросы по теме