我有两个Relay突变,我先嵌套,先添加一个对象然后设置它的名字。我相信我传递给第二个突变的事实上是Relay获取的数据,但它似乎不同意我的看法。 React视图中的代码如下:
Relay.Store.update(
new AddCampaignFeatureLabelMutation({
campaign: this.props.campaign
}),
{
onSuccess: (data) => {
Relay.Store.update(
new FeatureLabelNameMutation({
featureLabel: data.addCampaignFeatureLabel.featureLabelEdge.node,
name: this.addLabelInputField.value
})
);
},
onFailure: () => {}
}
);
这确实有效,但给了我一个警告:
Warning: RelayMutation: Expected prop `featureLabel` supplied to `FeatureLabelNameMutation` to be data fetched by Relay. This is likely an error unless you are purposely passing in mock data that conforms to the shape of this mutation's fragment.
为什么Relay认为数据没有被提取?我是否需要以某种方式明确地在有效载荷中返回新的featureLabel?
答案 0 :(得分:42)
我遇到了同样的问题,我花了一些时间来弄清楚发生了什么,所以这可能对其他人有所帮助:
正如警告所说,你必须为Relay提取的变异提供一个实体。但是警告没有说的是它必须考虑到突变。
所以基本上你必须在初始查询中添加你将要在其上执行的变异,如下所示:
fragment on Person {
firstname,
lastname,
language,
${UpdatePersonMutation.getFragment('person')}
}
这将向商店中的实体添加必要的部分,这些部分是突变所需的。
在您的情况下,您需要将FeatureLabelNameMutation
getFragment
添加到AddCampaignFeatureLabelMutation
查询中。这将使您的featureLabel
实体获得FeatureLabelNameMutation
的必要信息,以便在没有任何警告的情况下成功。
在这个和许多其他领域,Relay文档非常糟糕。
答案 1 :(得分:7)
Relay期望您的突变的任何片段都来自您的"fields": {
"cat": [1]
}
。由于您使用的是来自回调的props
而不是来自您的容器道具,因此Relay会发出警告。
查看来源:https://github.com/facebook/relay/blob/master/src/mutation/RelayMutation.js#L289-L307