我很好奇处理突变的“正确”方法,其中大部分图形可能受到影响 . 最好的例子是删除一个“父”节点,导致删除一堆子节点 . 现有的变异配置(FIELDS_CHANGED,NODE_DELETE等)足以进行相对简单的操作,但我不确定处理更复杂事情的正确方法 .

一个具体的例子会有帮助 . 让's assume we'重新使用经典的Relay示例应用程序,并使用三种特定类型: ShipFactionUser . 假设 Ships 属于 Faction (多对一),而 Users 属于 favorite_ships 连接(多对多) . 伪架构可能是这样的:

galaxy {
  ships
  factions { ships }
  users { favorite_ships }
}

好吧,很酷 . 我们有一个名为"Empire"的 Faction ,其中有一堆船只连接如"Tie Fighter","Star Destroyer"等 . 然后我们有一个 User ,其最喜欢的船只通过 favorite_ships 连接包含"Tie Fighter" .

到目前为止都很好 . 现在一些朋克出现并通过 DestroyFactionMutation 摧毁了整个"Empire" Faction . 所述突变的输入非常简单: Faction id,但突变对后端的影响很大:

  • 删除了给定的 Faction 节点

  • 所有关联的 Ship 节点也被删除

  • 所有关联的 User { favorite_ship } 条目也将被删除

因此,我的问题是: How do you write the mutation payload, fat query, and mutation configs to model this with Relay?

在考虑了一下后,我想可能是这样的:

type DestroyFactionMutationPayload {
  clientMutationId: String!
  user: User
  destroyedFactionId: String
  affectedUserIds: [String]
  destroyedShipIds: [String]
}

然后客户端会像这样更新:

  • 添加NODE_DELETE配置以删除与 destroyedFactionId 对应的 Faction 节点,这是有充分记录和直截了当的

  • 添加NODE_DELETE配置以删除 destroyedShipIds 配置对应的 Ship 节点,但使用 parentID 的内容?你是否需要为每个 affectedUserIds 生成一个NODE_DELETE,如果是这样,你如何获取这些ID以便它们在变异道具中...... REQUIRED_CHILDREN?

  • 如果#2真的没有那样的话,也许你可以添加一个FIELDS_CHANGE配置,指定 user { favorite_ships } 可以改变,给定 affectedUserIds (也可能通过REQUIRED_CHILDREN获取?)

对不起,如果这是漫无目的,不清楚;希望这种“类型”的变异对于那些已经使用Relay一段时间的人来说是熟悉的 . 我可以尝试这些选项,但我想对这样的“最佳”方法提出一些建议 . 谢谢!