如何将查询与阿波罗的refetchQuery匹配

时间:2019-03-22 19:15:37

标签: graphql apollo apollo-client

我的基本问题是查询的变量是否需要精确才能使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。有可能吗?

1 个答案:

答案 0 :(得分:1)

我相信您会想要在@connectiongql的{​​{1}}定义中添加notesQuery指令。您没有发布这些内容,因此很遗憾,我无法确切显示您的用例。

无论如何,measurementsQuery指令将允许Apollo例如在@connection上进行匹配,而忽略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函数的工作方式,该方法不起作用。它只会忽略以上尝试获得比arg名称更好的分辨率的尝试,即不能超出getStoreKeyName()。过滤器数组中与arg名称不匹配的任何字符串都将被忽略。

看起来您必须修改架构。

更多信息,请访问:https://www.apollographql.com/docs/react/features/pagination.html#connection-directive