14

我嵌套了两个 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 ?

4

2 回答 2

42

我遇到了同样的问题,我花了一些时间才弄清楚发生了什么,所以这可能对其他人有所帮助:

正如警告所说,您必须为 Relay 获取的突变提供一个实体。但是警告没有说的是必须在考虑突变的情况下获取它。

因此,基本上您必须在初始查询中添加将来要对其执行的突变,如下所示:

          fragment on Person {
            firstname,
            lastname,
            language,
            ${UpdatePersonMutation.getFragment('person')}
          }

这将向商店中的实体添加突变所需的必要部分。

在您的情况下,您需要做的就是添加FeatureLabelNameMutation getFragment到您的AddCampaignFeatureLabelMutation查询中。featureLabel这将为您的实体带回必要的信息,以便在FeatureLabelNameMutation没有警告的情况下成功。

Relay 文档在这方面和许多其他方面都非常糟糕。

于 2016-01-13T20:05:45.057 回答
7

Relay 预计您的突变的任何片段都来自您的props. 由于您使用data的是来自您的回调而不是来自您的容器道具的东西,因此中继会引发该警告。

看一下源码:https ://github.com/facebook/relay/blob/master/src/mutation/RelayMutation.js#L289-L307

于 2015-11-18T19:24:19.380 回答