运行时函数
此页面记录了与 Relay 解析器关联的运行时函数。有关 Relay 解析器及其工作原理的概述,请参见 Relay 解析器 指南。
LiveResolverStore
要使用 Relay 解析器,您必须使用我们的实验性 Relay Store 实现 LiveResolverStore
,它从 relay-runtime/lib/store/experimental-live-resolvers/LiveResolverStore
导入。它的行为与默认的 Relay Store 相同,但也支持 Relay 解析器。
它公开了一种额外的面向用户的 batchLiveStateUpdates()
方法。有关如何使用此方法的更多详细信息,请参见 实时字段。
readFragment()
派生的解析器字段对图中其他数据派生而来的数据进行建模。要读取派生字段所依赖的数据,它们必须使用从 relay-runtime
导出的 readFragment()
函数。此函数接受一个 GraphQL 片段和一个片段键,并返回片段的数据。
readFragment()
只能在 Relay 解析器中使用。如果在任何其他上下文中使用它,它将抛出错误。
import {readFragment} from "relay-runtime";
/**
* @RelayResolver User.fullName: String
* @rootFragment UserFullNameFragment
*/
export function fullName(key: UserFullNameFragment$key): string {
const user = readFragment(graphql`
fragment UserFullNameFragment on User {
firstName
lastName
}
`, key);
return `${user.firstName} ${user.lastName}`;
}
请注意,Relay 将确保您的字段解析器在该片段中的任何数据发生更改时重新计算。
有关更多信息,请参见 派生字段 指南。
suspenseSentinel()
实时解析器对随时间变化的客户端状态进行建模。如果在该字段的生命周期中的某个时刻,正在读取的数据处于挂起状态(例如,如果数据正在从 API 中提取),解析器可能会返回 suspenseSentinel()
以指示数据尚不可用。
Relay 预计当数据可用时,LiveStateValue
将通过调用订阅回调通知 Relay。
import {suspenseSentinel} from 'relay-runtime';
/**
* @RelayResolver Query.myIp: String
* @live
*/
export function myIp(): LiveState<string> {
return {
read: () => {
const state = store.getState();
const ipLoadObject = state.ip;
if (ipLoadObject.status === "LOADING") {
return suspenseSentinel();
}
return state.ip;
},
subscribe: (callback) => {
return store.subscribe(callback);
},
};
}
有关更多信息,请参见 实时字段 指南。
useClientQuery()
如果查询仅包含客户端字段,则它目前可能无法与 usePreloadedQuery
和 useLazyLoadQuery
等挂钩一起使用,因为这两个挂钩都假设它们需要发出网络请求。如果尝试在 Flow 中使用这些 API,您将收到类型错误。
相反,对于仅限客户端的查询,您可以使用 useClientQuery
挂钩
import {useClientQuery} from 'react-relay';
export function MyComponent() {
const data = useClientQuery(graphql`
query MyQuery {
myIp
}
`);
return <div>{data.myIp}</div>;
}