【问题标题】:Relay mutation expects data fetched by Relay中继突变期望中继获取的数据
【发布时间】:2016-02-19 14:10:10
【问题描述】:

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

【问题讨论】:

    标签: relayjs


    【解决方案1】:

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

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

    【讨论】:

    • 所以,这只是一个警告,不会在使用数据时造成任何问题?
    • @javvvva 不,请参阅下面的答案。该警告实际上突出了一个真正的错误行为,但并没有很好地解释它。
    【解决方案2】:

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

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

    所以基本上你必须像这样在初始查询中添加将来要对其执行的突变:

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

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

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

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

    【讨论】:

    • 这里的回复有点晚,但这也是我最终发现的。同意文件参差不齐;我最终只是去源头解决这个问题。
    • @Christine,我有一个非常相似的问题。介意看看我的question吗?我会永远感激不尽!
    • 该死的,我总是忘记包含碎片,并且一直在挠头……按我犯这个错误的次数来看,现在不应该知道这一点。并不是说错误消息有多大帮助....
    • 谢谢!花了几个小时。
    • 我想在这里添加一些内容:我们需要添加getFragment('person') 部分的原因是它将创建一个具有隐藏属性__fragments__ 的对象,Relay 使用该属性来跟踪其对象。因此,如果您只是将没有__fragments__ 的对象传递给突变,它仍然无法工作,即使您在该对象中传递了所有正确的值。 Relay 仍然会给出模棱两可的警告。
    猜你喜欢
    • 1970-01-01
    • 2017-07-13
    • 2017-06-27
    • 2016-09-12
    • 1970-01-01
    • 2015-05-01
    • 2018-02-24
    • 2017-01-21
    • 2016-12-10
    相关资源
    最近更新 更多