跳到主要内容
版本:v18.0.0

运行时函数

此页面记录了与 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()

如果查询仅包含客户端字段,则它目前可能无法与 usePreloadedQueryuseLazyLoadQuery 等挂钩一起使用,因为这两个挂钩都假设它们需要发出网络请求。如果尝试在 Flow 中使用这些 API,您将收到类型错误。

相反,对于仅限客户端的查询,您可以使用 useClientQuery 挂钩

import {useClientQuery} from 'react-relay';

export function MyComponent() {
const data = useClientQuery(graphql`
query MyQuery {
myIp
}
`);
return <div>{data.myIp}</div>;
}