React Relay 更新根查询作为突变胖查询的一部分

Posted

技术标签:

【中文标题】React Relay 更新根查询作为突变胖查询的一部分【英文标题】:React Relay update a root query as part of a mutation fat query 【发布时间】:2016-07-17 04:53:29 【问题描述】:

我正在尝试使用 GraphQL 和 React Relay 构建应用程序。

作为其中的一部分,我创建了一个具有以下规范的根查询:

query 
  AllServices 
    edges 
      node 
        id
      
    
  

所以我创建了一个突变 - 效果很好 - 称为 CreateGithubService。

这是来自 Relay 突变的 sn-p:

getFatQuery() 
      return Relay.QL`
        fragment on CreateGithubServicePayload 
          createdService
        
      `
  

  getConfigs() 
      return [
          type: "REQUIRED_CHILDREN",
          children: [
              Relay.QL`
                  fragment on CreateGithubServicePayload 
                      createdService 
                          id
                      
                  
              `
          ]
      ]
  

我遇到的问题是,这不会导致依赖信息的视图更新。

我的 AllServices 查询未重新获取,我无法在 Fat Query 中指定它。

如何设置我的突变以将元素添加到所有服务查询?

谢谢!

【问题讨论】:

【参考方案1】:

REQUIRED_CHILDREN 不会更新本地图;它严格用于获取仅在突变更新的成功回调中使用的额外数据。事实上,它甚至没有在源代码之外记录,所以我不确定你是如何决定这样使用它的......

虽然您没有这么说,但我假设您希望将这个新节点 (createdService) 添加到 AllServices 连接中?如果是这样,您需要告诉 Relay 您的突变会影响该连接:

    目前,Relay 基本上假设所有突变都会影响节点,而不是任意查询。据我所知,您将无法配置突变来更新非节点根查询。因此,您应该在根节点添加一个节点,作为AllServices 连接的父节点(此约定通常为viewer)。换句话说,让它像这样工作:query viewer AllServices ...

    您的变异负载应始终返回已更改的所有内容,而不仅仅是新数据。这意味着您需要一种从有效负载中重新获取AllServices 连接的方法。将 viewer 节点添加到架构后,您可以在突变有效负载中返回该节点并更改胖查询以指定连接已更改,例如:fragment on CreateGithubServicePayload viewer AllServices

    鉴于这两个架构更改,然后您可以使用FIELDS_CHANGE 配置您的突变并指定像 viewer: this.props.viewer.id 这样的字段ID

【讨论】:

以上是关于React Relay 更新根查询作为突变胖查询的一部分的主要内容,如果未能解决你的问题,请参考以下文章

中继:有条件地在突变的胖查询中包含字段

React Relay:复杂的突变脂肪查询

Relay.js 中的根查询创建和删除

如何将值传递给 react-router-relay 中的根查询

React-relay 嵌套突变后未获得有效负载

使用具有不同片段字段的相同中继根查询的多个 react-router-relay 路由