定义类型
您可以将客户端状态解析器视为定义在客户端运行的 GraphQL 服务器。就像使用服务器定义的 GraphQL 服务器一样,您需要定义模式中存在的类型以及这些类型上的字段。与 GraphQL 服务器一样,字段被定义为从父对象计算 GraphQL 值的函数。在 Relay Resolvers 中,我们称此父 JavaScript 对象为类型的“模型”。
每个客户端状态 GraphQL 类型都由一个 JavaScript 对象类型支持,这些文档将称其为其“模型类型”。“在”此类型上的解析器将被传递此类型的一个实例作为其第一个参数。
解析器类型使用@RelayResolver
标签定义,后跟您要定义的类型的名称。默认情况下,Relay 假设您的客户端类型是“强类型”,这意味着每个实例都有一个在该类型中唯一的 ID。此属性允许 Relay 应用许多优化,例如记忆解析器计算。
定义“强”类型
强类型通过一个 docblock 定义,后跟一个导出的函数,其名称与类型的名称匹配,并且接受一个 ID 作为其唯一参数,并返回该类型模型的一个实例。定义到此类型的边的解析器只需要返回对象的 ID,而不是自己派生模型。
- Docblock
/**
* @RelayResolver User
*/
export function User(id: DataID): UserModel {
return UserService.getById(id);
}
/**
* @RelayResolver
*/
export function User(id: DataID): UserModel {
return UserService.getById(id);
}
在文档的其他地方,此函数被称为该类型的“模型解析器”。
通常,客户端数据存储中的对象能够随着时间的推移而发生变化。为了支持这一点,Relay Resolvers 支持订阅底层数据源的解析器。要了解有关此内容的信息,请参阅有关实时字段的页面。
定义“弱”类型
如果您的类型没有唯一的标识符,则可以通过添加@weak
docblock 标签将其定义为“弱”类型。弱类型通过一个 docblock 定义,后跟一个导出的类型定义,与类型的名称匹配。定义到弱类型的边的解析器需要返回一个与该类型匹配的完全填充的模型对象。
- Docblock
/**
* @RelayResolver ProfilePicture
* @weak
*/
export type ProfilePicture = { url: string, height: number, width: number };
/**
* @RelayResolver
*/
export type ProfilePicture = { url: string, height: number, width: number };
通常,弱类型用于为最终“属于”父对象的字段集创建命名空间。