REQUIRED_CHILDREN连接上的实际属性名称

时间:2017-01-16 06:52:33

标签: relay

在中继中,使用REQUIRED_CHILDREN时如此:

   return [{
      type: 'REQUIRED_CHILDREN',
      children: [
        Relay.QL`
          fragment on Payload {
            myConnection (first: 50) {
              edges {
                node {
                  ${fragment}
                }
              }
            }
          }
        `
      ]
    }]

并通过onSuccess回调读取回复:

Relay.Store.commitUpdate(
  new AboveMutation({  }), { onFailure, onSuccess }
)

响应将属性myConnection转换为散列名称(即__myConnection652K),这可能用于防止中继存储区内的连接/列表冲突。

但是,由于这是REQUIRED_CHILDREN并且我手动阅读myConnection,因此只是阻止了对它的访问。

使用onSuccess回调时有没有办法获取实际的属性名称?

1 个答案:

答案 0 :(得分:0)

就像艾哈迈德写道:使用REQUIRED_CHILDREN意味着你不会存储结果。其结果是提供给回调的数据是原始形状(几乎与服务器相同)并且data masking不适用。

尽管没有存储数据,但似乎没有理由(尽管核心团队成员的观点在这里肯定更合适)不将其转换为客户端样式形状。这是最新类型的突变,因此有可能意外省略了这种特征。查询转换为服务器样式形状是正常的,也可以进行相反的转换。但是直到现在还没有 - 在将数据保存到商店并更新组件道具的同时,进行了转换。目前大多数Relay团队都非常注重重写大部分实现,所以我不希望这个问题很快得到改善。

同样,Ahmed提出的将类型转换为GraphQLList的解决方案似乎是最简单,最可靠的。如果由于任何原因您想要通过连接,可以选择将GraphQL fragment作为children提供(实际上它的解析形式存储在原始片段的__cachedFragment__属性中)并遍历它获得所需字段的serializationKey(例如__myConnection652K)。