中继突变需要Relay提取的数据

时间:2015-11-18 00:50:52

标签: relayjs

我有两个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?

2 个答案:

答案 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