在react-apollo中使用refetchQueries时使用现有变量

时间:2019-04-11 18:24:05

标签: javascript graphql apollo react-apollo prisma-graphql

我正在使用CREATE TABLE [dbo].[Fact_SalesTransaction] ( [FactSalesTransactionId] INT IDENTITY (1, 1) NOT NULL, [DimCustomerId] INT NOT NULL, [DimSellerId] INT NOT NULL, [SalesDatetime] DATETIME NULL, [DimSalesDateId] INT NULL, [SalesAmount] DECIMAL (28, 2) NULL, [ETLCreateDate] DATETIME NULL, ); CREATE CLUSTERED COLUMNSTORE INDEX ccx_Fact_SalesTransaction ON Fact_SalesTransaction; CREATE UNIQUE INDEX unx_FactSalesTransactionId ON dbo.Fact_SalesTransaction (FactSalesTransactionId); 查询进行无限滚动。它包含变量postsConnection。 完成upvote突变后,我想after ...像这样

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) { .... } } 时如何重用它们?

以下是我已阅读的有关此问题的一些资源

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

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

2 个答案:

答案 0 :(得分:0)

the issue you linked中所述,您应该能够执行以下操作:

import { getOperationName } from 'apollo-link'

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

来自docs

  

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

getOperationName只需解析传递给它的文档并从中提取操作名称。当然,您可以自己以字符串的形式提供操作名称,但是这种方式可以避免将来更改操作名称或使用胖手指时出现问题。

答案 1 :(得分:0)

如果您不想引入 apollo-link,您也可以通过基础 graphql 包获得它(请注意,我使用 optional chaining 是为了方便:

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]
})