类型安全更新器常见问题解答
一般
什么是类型安全更新器?
类型安全更新器是为提供一个类型安全且符合人体工程学的方法来替代现有 API 的项目名称,该方法用于以命令方式更新 Relay 存储中的数据。
为什么?
Relay 提供类型安全且符合人体工程学的 API,用于获取和管理源自服务器的数据。此外,Relay 还提供了在**客户端模式扩展**中定义仅本地字段的功能。但是,用于更改这些字段中数据的 API 迄今为止一直冗长且不符合人体工程学,这意味着我们无法推荐 Relay 作为管理本地状态的解决方案。
现有 API 的问题是什么?
现有的 API 冗长且不类型安全。它们很容易造成各种错误,并且要求开发人员在编写更新程序时仅了解一组新的 API。
类型安全更新器是一组类型安全且(希望)更符合人体工程学的 API。它们利用了众所周知的 Relay 惯例(查询、片段、类型细化)并使用 getter 和 setter,而不是要求开发人员学习一组在其他地方未使用的方法。
开发人员如何使用类型安全更新器?
使用类型安全更新器,开发人员会编写一个可更新的查询或片段,用于指定以命令方式更新的数据。然后,开发人员从存储中读出该数据,返回一个所谓的**可更新代理**。然后,开发人员修改该可更新代理。使用 setter 修改该可更新代理(例如,updatableData.name = "Godzilla"
)会导致调用旧的 API,但会增加类型安全性。
为什么这些被标记为_EXPERIMENTAL
?
这些实际上并不实验性。我们鼓励您在编写新代码时使用它们!此后缀将很快被移除。
什么是可更新的查询或片段?
可更新的查询或片段是带有@updatable
指令的查询或片段。
可更新的查询和片段不会被获取
在可更新的查询和片段中选择的字段会从服务器获取吗?
不会!服务器不知道可更新的查询和片段。它们的字段永远不会被获取。
即使您在常规查询或片段中扩展了可更新的片段,在该请求中也不会获取该可更新片段选择的字段。
如果我想获取一个字段并对其进行更改,该怎么办?
您应该在常规查询/片段**和**可更新的查询/片段中选择该字段。
这会带来什么后果?
- 当您读出可更新的数据时,如果它不在存储中,则可能丢失。
- 您不能在可更新的查询/片段中扩展常规片段。
- 可更新的查询/片段的生成工件不包含查询 ID,也不包含规范化 AST(用于将网络数据写入存储)。
@defer
等指令在这种情况下没有意义,因此不允许使用。
杂项
我在哪里可以获取store
?
RelayRecordSourceSelectorProxy
和 RelayRecordSourceProxy
类包含readUpdatableQuery
和 readUpdatableFragment
方法。可以获取这些类的实例
- 在突变和订阅的更新程序中
- 在突变的乐观更新程序中
- 使用
RelayModernEnvironment
的commitUpdate
、applyUpdate
等方法时。 - 使用独立的
commitLocalUpdate
方法时。