使用:“ react-apollo”:“ ^ 1.4.3”
在父组件中,我使用GraphQL查询父节点“ Fund”和子项“ fundQuarterlyMetric”。这将以以下格式返回数据:
{ id name ... fundQuarterlyMetrics (orderBy: asAtDate_ASC) { id year quarter ... } }
当我尝试创建新的fundQuarterlyMetrics时,我必须使用更新功能(Apollo Client docs)在react- apollo上更新本地商店。它给我一个错误:
Can't find field Fund({}) on object (ROOT_QUERY) { "Fund({\"id\":\"cj57hpfips0x7014414u5tk8m\"})": { "type": "id", "id": "Fund:cj57hpfips0x7014414u5tk8m", "generated": false }
问题是,当我用console.log代理时,我可以看到该基金及其下属子公司。..不知道该怎么办..
更新以下评论:
这是父组件数据请求:
export const fundPageQuery = gql` query Fund($fundId: ID!) { Fund(id: $fundId) { id name ....other variables fundQuarterlyMetrics (orderBy: asAtDate_ASC) { id year quarter ....other variables } }
}`;
这是我使用的选项:
var optionsForCreateFundMetric = { update: (proxy, {data: {createFundMetrics}}) => { try { console.log('proxy', proxy); const data = proxy.readQuery({query: FundQL.fundPageQuery}); console.log('data', data); data.Fund.fundQuarterlyMetrics.push(createFundMetrics); proxy.writeQuery({query: FundQL.fundPageQuery, data}) } catch (e) { console.log('error adding to store', e); }
};
export default compose( graphql(FundQL.createFundMetrics, {name: 'createFundMetrics', options: optionsForCreateFundMetric}), graphql(FundQL.updateFundMetrics, {name: 'updateFundMetrics'}) )(FundMetricsForm);
这是我的创建突变:
export const createFundMetrics = gql` mutation createFundQuarterlyMetric( $fundId: ID $year: Int! $quarter: FUND_QUARTERLY_METRIC_QUARTER! $netIRR: Float! $tvpi: Float! $rvpi: Float! $dpi: Float! $asAtDate: DateTime $calledThisQuarter: Float! $distributedThisQuarter: Float! $cumulativeCalled: Float! $cumulativeDistributed: Float! $limitedPartnersNAV: Float! $quarterlyValuationChangeLCY: Float $quarterlyTotalReturn: Float ) { createFundQuarterlyMetric( fundId: $fundId year: $year quarter: $quarter netIRR: $netIRR tvpi: $tvpi rvpi: $rvpi dpi: $dpi asAtDate: $asAtDate calledThisQuarter: $calledThisQuarter distributedThisQuarter: $distributedThisQuarter cumulativeCalled: $cumulativeCalled cumulativeDistributed: $cumulativeDistributed limitedPartnersNAV: $limitedPartnersNAV quarterlyValuationChangeLCY: $quarterlyValuationChangeLCY quarterlyTotalReturn: $quarterlyTotalReturn ) { id year quarter netIRR tvpi rvpi dpi asAtDate calledThisQuarter distributedThisQuarter cumulativeCalled cumulativeDistributed limitedPartnersNAV quarterlyValuationChangeLCY quarterlyTotalReturn }
解决方案感谢Daniel-我必须退回资金ID才能使用,谢谢!
export default compose( graphql(FundQL.createFundMetrics, {name: 'createFundMetrics', options: optionsForCreateFundMetric, variables: {fundId: createFundQuarterlyMetric.fund.id}}), graphql(FundQL.updateFundMetrics, {name: 'updateFundMetrics'}) )(FundMetricsForm);
Apollo文档在强调这一事实方面做得很差,但是当您调用readQuery从商店中获取以前获取的查询时,如果该查询带有任何变量,则需要传递这些相同的变量以进行检索。假设突变返回的ID是基金的ID,您应该可以修改以下行:
readQuery
const data = proxy.readQuery({ query: FundQL.fundPageQuery, variables: { id: createFundMetrics.id }, });