我很好奇处理突变的“正确”方法,其中大部分图形可能受到影响 . 最好的例子是删除一个“父”节点,导致删除一堆子节点 . 现有的变异配置(FIELDS_CHANGED,NODE_DELETE等)足以进行相对简单的操作,但我不确定处理更复杂事情的正确方法 .
一个具体的例子会有帮助 . 让's assume we'重新使用经典的Relay示例应用程序,并使用三种特定类型: Ship
, Faction
和 User
. 假设 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一段时间的人来说是熟悉的 . 我可以尝试这些选项,但我想对这样的“最佳”方法提出一些建议 . 谢谢!