带有 Relay-GraphQL 突变的撤销-重做状态遍历模式

Posted

技术标签:

【中文标题】带有 Relay-GraphQL 突变的撤销-重做状态遍历模式【英文标题】:Patterns for undo-redo state traversal with Relay-GraphQL mutations 【发布时间】:2016-02-04 10:02:22 【问题描述】:

使用 Immutable 和 Flux 实现实现撤消/重做功能基本上是微不足道的。这部分是由于 Immutable 使值传递成为可能,部分是由于使用 Flux 的浏览器/内存特性。

然而,用 Relay-GraphQL 突变来概念化这一点并不明显。是否有任何已知的模式可以简化这一点?

【问题讨论】:

你能澄清一下用例吗?撤消/重做的动机是为了启用调试,还是提供面向用户的能力来撤消/重做已在服务器上提交的突变? @JoeSavona 用例基本上是撤消重做功能。但是自从发布这个问题以来,我对 GraphQL/Relay 有了更多的了解,而且这种功能似乎超出了他们的范围。就范围内的任何事物而言,记住这一点并有助于实现此类功能会很有趣。 @JoeSavona 感谢您的工作和时间。这些都是很棒的项目。 【参考方案1】:

Relay(还)不能做本地状态。因此,您目前的选择是 a) 在 Flux 存储中存储更改的“草稿”,或者 b) 创建一个草稿类型,您可以通过突变不断创建新版本。您可以在客户端跟踪新的草稿 ID,并通过还原活动草稿 ID 来“撤消”。

【讨论】:

我推荐使用非常小的库 immutable-diff 和 immutable-patch 在前端存储突变,然后您可以将合并的补丁列表发送到后端执行实际突变。 这实际上不再是真的了。中继确实处理本地状态:relay.dev/docs/en/local-state-management.

以上是关于带有 Relay-GraphQL 突变的撤销-重做状态遍历模式的主要内容,如果未能解决你的问题,请参考以下文章

撤销重做

撤销和重做实现-第二部分(命令模式)

撤销和重做实现-第二部分(命令模式)

撤销和重做实现-第三部分(备忘录模式)

撤销和重做实现-第三部分(备忘录模式)

撤销和重做实现-第一部分(单对象状态变化)