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

时间:2016-03-29 14:44:06

标签: reactjs graphql relayjs graphql-js

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

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

query {
  AllServices {
    edges {
      node {
        id
      }
    }
  }
}

所以我创建了一个很好的变种 - 名为CreateGithubService。

以下是Relay变异的片段:

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

答案 0 :(得分:5)

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

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

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

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

  3. 鉴于这两个架构更改,您可以使用FIELDS_CHANGE配置您的突变并指定{ viewer: this.props.viewer.id }
  4. 之类的字段ID