4

我正在使用postsConnection无限滚动查询。它包含变量,如after. 在做了一个upvote突变之后,我想refetchQueries......像这样

const upvote = await client.mutate({
      mutation: UPVOTE_MUTATION,
      variables: {
        postId: this.props.post.id
      },
      refetchQueries: [
        { query: POST_AUTHOR_QUERY }
      ]
    })

上面的代码给出了错误,因为POST_AUTHOR_QUERY接受的变量很少。这是那个查询

export const POST_AUTHOR_QUERY = gql`
    query POST_AUTHOR_QUERY($authorUsername: String! $orderBy: PostOrderByInput $after: String){
        postsAuthorConnection(authorUsername: $authorUsername orderBy: $orderBy after: $after) {
                   ....
        }
    }

我不想手动添加变量。变量已经存储在缓存中。如何在使用时重复使用它们refetchQueries???

这是我读过的一些关于这个问题的资源

https://github.com/apollographql/react-apollo/issues/817

https://github.com/apollographql/apollo-client/issues/1900

4

2 回答 2

4

如果你不想拉进来apollo-link,你也可以通过 basegraphql包得到这个(注意,为了方便,我使用了可选链:

import { getOperationAST } from 'graphql';


const operationName = getOperationAST(POST_AUTHOR_QUERY)?.name?.value;
// Note that this could technically return `undefined`

const upvote = await client.mutate({
  mutation: UPVOTE_MUTATION,
  variables: {
    postId: this.props.post.id
  },
  refetchQueries: [operationName]
})
于 2021-03-21T15:35:19.600 回答
3

您链接的问题中所述,您应该能够执行以下操作:

import { getOperationName } from 'apollo-link'

const upvote = await client.mutate({
  // other options
  refetchQueries={[getOperationName(POST_AUTHOR_QUERY)]}
})

文档

请注意,如果您使用字符串数组调用 refetchQueries,则 Apollo 客户端将查找任何先前调用的与提供的字符串具有相同名称的查询。然后它将使用当前变量重新获取这些查询。

getOperationName只需解析您传递给它的文档并从中提取操作名称。当然,您可以自己提供操作名称作为字符串,但这种方式可以避免将来操作名称发生更改或您对它进行粗暴处理时出现问题。

于 2019-04-11T18:46:25.517 回答