类 ApolloClient
API 参考
关于ApolloClient
类封装了 Apollo 的核心客户端 API,支持所有可用的视图层集成(例如 React、iOS 等)。
ApolloClient
构造函数
构造 ApolloClient
的实例。
需要传递一个 ApolloClientOptions
参数,该参数支持以下列出的字段。
返回一个初始化的 ApolloClient
对象。
示例
import { ApolloClient, InMemoryCache } from '@apollo/client';const cache = new InMemoryCache();const client = new ApolloClient({// Provide required constructor fieldscache: cache,uri: 'https://127.0.0.1:4000/',// Provide some optional constructor fieldsname: 'react-web-client',version: '1.3',queryDeduplication: false,defaultOptions: {watchQuery: {fetchPolicy: 'cache-and-network',},},});
关于 defaultOptions
对象的更多信息,请参阅以下部分。
函数
该功能监视根据指定的选项缓存的 查询 并返回一个 ObservableQuery
。我们可以订阅这个 ObservableQuery
并且在缓存存储变化时通过观察者接收更新结果。
注意,此方法不是 GraphQL 订阅 的实现。而是使用 Apollo 的存储,以便在查询结果上反应性地提供更新。
例如,假设您在一个 GraphQL 查询上调用 watch 方法来获取某人的姓名,此查询提供了由 dataIdFromObject 提供的特定对象标识符。稍后,另一个查询获取了同一个人的姓名,而姓名已经发生了变化。然后,与第一个查询的结果相关联的任何观察者都将使用新的结果对象更新。
注意,如果缓存没有发生变化,则订阅者将 不会 被通知。
有关存储反应性的描述,请见 此处。
签名
function watchQuery(options: WatchQueryOptions<TVariables, T>): ObservableQuery<T, TVariables>
参数
options
WatchQueryOptions<TVariables, T>
显示/隐藏子属性
ErrorPolicy
DocumentNode | TypedDocumentNode
将GraphQL查询字符串解析为用gql模板字面量表示的AST。
TVariables
一个包含所有 GraphQL 变量的对象,这些变量是您查询执行所必需的。
对象中的每个键与变量名称相对应,该键的值对应变量值。
DefaultContext
如果您正在使用Apollo Link,则该对象是在传递到您的链接链的context
对象中的初始值。
如果设置为true
,则当网络状态更改或发生网络错误时,正在进行的查询相关组件将重新渲染。
默认值是false
。
number
指定查询轮询更新结果的间隔(毫秒)。
默认值是0
(无轮询)。
() => boolean
当轮询发生引用尝试时调用的回调函数。如果函数返回true
,则轮询将跳过并在下一个轮询间隔之前不再重试。
WatchQueryFetchPolicy
WatchQueryFetchPolicy
默认为选项.fetchPolicy的初始值,但可以显式配置以指定Watch查询FetchPolicy,以便在变量更改时无论是否被nextFetchPolicy干预都会回退。
WatchQueryFetchPolicy | ((this: WatchQueryOptions, currentFetchPolicy: WatchQueryFetchPolicy, context: NextFetchPolicyContext) => WatchQueryFetchPolicy)
指定此查询完成后使用的FetchPolicy
。
RefetchWritePolicy
指定NetworkStatus.refetch
操作是否应该合并传入字段
数据与现有数据,或者覆盖现有数据。覆盖可能是更好的选择,但目前默认行为是合并,以向后兼容Apollo Client 3.x。
boolean
如果为true
,则查询可以从缓存返回部分结果,如果缓存不包含所有查询的字段结果。
默认值是false
。
boolean
⚠️ 已弃用
使用canonizeResults
可能导致内存泄漏,因此我们一般不建议再使用此选项。Apollo Client的下一个版本将包含一个类似的功能,但没有内存泄漏的风险。
是否在返回之前将缓存结果canonize。Canonization需要额外的时间,但它可以加快未来的深度比较速度。默认为false。
boolean
⚠️ 已弃用
由于-fetch策略的更一致应用,在Apollo Client 3中设置此选项是不必要的。它可能在未来的版本中删除。
如果为true
,则当检测到查询结果为部分结果时,将导致查询重取。
默认值是false
。
结果
ObservableQuery<T, TVariables>
根据指定的选项解析单个查询,并返回一个Promise
对象,该对象可以是解析为结果数据或由于错误而被拒绝。
签名
function query(options: QueryOptions<TVariables, T>): Promise<ApolloQueryResult<T>>
参数
options
QueryOptions<TVariables, T>
一个类型为QueryOptions
的对象,允许我们描述如何处理此查询,例如是否应该击中服务器或只从缓存中解析等。
显示/隐藏子属性
ErrorPolicy
DocumentNode | TypedDocumentNode
将GraphQL查询字符串解析为用gql模板字面量表示的AST。
TVariables
一个对象,包含你的查询执行所需的所有GraphQL变量。
对象中的每个键对应一个变量名,该键的值对应于变量的值。
DefaultContext
如果您正在使用Apollo Link,则该对象是在传递到您的链接链的context
对象中的初始值。
如果设置为true
,则当网络状态更改或发生网络错误时,正在进行的查询相关组件将重新渲染。
默认值是false
。
number
指定查询轮询更新结果的间隔(毫秒)。
默认值是0
(无轮询)。
FetchPolicy
boolean
如果 true
,则查询可以返回缓存中的部分结果,如果缓存不包含所有查询字段的结果。
默认值是false
。
boolean
⚠️ 已弃用
使用canonizeResults
可能导致内存泄漏,因此我们一般不建议再使用此选项。Apollo Client的下一个版本将包含一个类似的功能,但没有内存泄漏的风险。
是否在返回之前将缓存结果canonize。Canonization需要额外的时间,但它可以加快未来的深度比较速度。默认为false。
boolean
⚠️ 已弃用
由于-fetch策略的更一致应用,在Apollo Client 3中设置此选项是不必要的。它可能在未来的版本中删除。
如果为true
,则当检测到查询结果为部分结果时,将导致查询重取。
默认值是false
。
结果
Promise<ApolloQueryResult<T>>
显示/隐藏子属性
T
ApolloError
这是传递给onError和Query链式调用的单一错误对象,通常在手动调用 client.query
时抛出。它将包含网络错误字段和任何GraphQL错误。有关更多信息,请参阅 https://apollo.graphql.net.cn/docs/react/data/error-handling/。
ReadonlyArray
服务器端执行GraphQL操作期间发生的任何错误列表。有关更多信息,请参阅 https://apollo.graphql.net.cn/docs/react/data/error-handling/。
boolean
NetworkStatus
boolean
根据指定的选项解析单个 mutation,并返回一个Promise,该Promise要么 Resolve with the resulting data,要么 reject with an error。在某些情况下,data
和errors
可能都是 undefined,例如当errorPolicy
设置为'ignore'
时。
它接受一个具有以下键值的对象作为选项:
签名
function mutate(options: MutationOptions<TData, TVariables, TContext>): Promise<FetchResult<TData>>
参数
options
MutationOptions(TData, TVariables, TContext)
显示/隐藏子属性
boolean
如果为 true
,则确保在将应用变更视为完成之前,完成全部 refetchQueries
中包含的所有查询。
默认值是 false
(异步重新查询)。
ErrorPolicy
DocumentNode | TypedDocumentNode
包含单个mutation的GraphQL document。通常使用包含在graphql-tag
包中的gql
创建。
OnQueryUpdated<any>
可选的回调,用于拦截由 mutation 更新的缓存数据的查询,以及传递到 client.mutate
的 refetchQueries: [...]
列表中的任何查询。
从 onQueryUpdated
返回一个 Promise
会使最后的 mutation
Promise
等待返回的 Promise
。返回 false
将使查询被忽略。
((result: FetchResult<TData>) => InternalRefetchQueriesInclude) | InternalRefetchQueriesInclude
一个数组(或返回一个数组的函数)指定你在 mutation 之后想要重新执行的查询。
每个数组值可以是以下之一
包含要执行 query 以及任何 variables
表示要重新执行的 query 的 operation name 的字符串
TVariables
包含你的 mutation 需要执行的所有的 GraphQL variables 的对象。
对象中的每个键对应一个变量名,该键的值对应于变量的值。
TContext
如果您正在使用Apollo Link,则该对象是在传递到您的链接链的context
对象中的初始值。
MutationFetchPolicy
提供 no-cache
如果 mutation 的结果不应该写入 Apollo Client 缓存。
默认值是 network-only
(这意味着结果将写入缓存)。
与查询不同, mutations 不支持 除了 network-only
和 no-cache
之外的 fetch policies。
TData | ((vars: TVariables, { IGNORE }: { IGNORE: IgnoreModifier; }) => TData | IgnoreModifier)
提供一个对象或回调函数,在 mutation 之后调用,允许您返回乐观数据并在必要时通过 IGNORE 信号对象跳过更新,Apollo Client 将将此临时(可能不正确)的响应缓存到 mutation 完成,以实现更响应式的外观更新。
有关更多信息,请参阅 乐观的 mutation 结果。
MutationUpdaterFunction<TData, TVariables, TContext, TCache>
Apollo Client 在 mutation 完成后用于更新缓存的函数。
更多信息,请参阅 突变后更新缓存。
boolean
为了避免保留 mutation根字段的敏感信息,Apollo Client v3.4+在每次 mutation完成后会自动从缓存中清除任何ROOT_MUTATION
字段。如果您需要这些信息保留在缓存中,您可以通过将keepRootFields: true
传递到 mutation来防止其被删除。ROOT_MUTATION
结果数据也会传递到 mutation的update
函数中,因此我们建议尽可能通过这种方式获取结果,而不是使用此选项。
MutationQueryReducersMap
一个MutationQueryReducersMap
,它是一个从查询名到 mutation查询还原器的映射。简要来说,这个映射定义了如何将突变的结果合并到当前由您的应用程序监视的查询的结果中。
结果
Promise<FetchResult<TData>>
根据指定的选项订阅一个GraphQL订阅,并返回一个Observable
,它可能会发出接收到的数据或错误。
签名
function subscribe(options: SubscriptionOptions<TVariables, T>): Observable<FetchResult<T>>
参数
options
SubscriptionOptions
显示/隐藏子属性
DefaultContext
组件和您的网络接口(Apollo Link)之间的共享上下文。
ErrorPolicy
指定此ErrorPolicy
操作的错误策略
Record
组件和您的网络接口(Apollo Link)之间的共享上下文。
FetchPolicy
指定组件如何与Apollo缓存交互。有关详细信息,请参阅设置获取策略。
DocumentNode | TypedDocumentNode
一个包含单个 subscription的GraphQL文档,通常使用gql
从graphql-tag
包创建。
TVariables
一个包含您订阅需要执行的 variables的所有对象
结果
Observable<FetchResult<T>>
尝试从提供的 GraphQL 查询中读取一些数据,而不进行网络请求。此方法将从根查询开始。要从一个由 dataIdFromObject
返回的具体 id 开始,请使用 readFragment
。
签名
function readQuery(options: DataProxy.Query<TVariables, T>,optimistic?: boolean): T | null
参数
options
DataProxy.Query<TVariables, T>
optimistic
(可选)
boolean
将此参数设置为 true
以允许 readQuery
返回乐观结果。默认值为 false
。
结果
T | null
尝试从提供的 GraphQL 片段 中读取一些数据,而不进行网络请求。此方法将会读取缓存中的任何任意 id 的 GraphQL 查询片段,与 readQuery
不同,后者只从根 查询 读取。
您必须传递一个包含单个 GraphQL 片段的文档或包含多个片段的文档,这些片段代表您正在读取的内容。如果您传递一个包含多个片段的文档,则还必须指定一个 fragmentName
。
签名
function readFragment(options: DataProxy.Fragment<TVariables, T>,optimistic?: boolean): T | null
参数
options
DataProxy.Fragment<TVariables, T>
optimistic
(可选)
boolean
将此参数设置为 true
以允许 readFragment
返回乐观结果。默认值为 false
。
结果
T | null
直接将符合提供的 GraphQL 查询形状的数据写入存储。此方法将从根查询开始。要从一个由 dataIdFromObject
返回的具体 id 开始,则使用 writeFragment
。
签名
function writeQuery(options: DataProxy.WriteQueryOptions<TData, TVariables>): Reference | undefined
参数
结果
Reference | undefined
显示/隐藏子属性
直接将提供的数据形状的 GraphQL 片段写入存储。此方法将写入缓存中的任何任意 id 的 GraphQL 查询片段,而不同于 writeQuery
,后者只能从根 查询 写入。
您必须传递一个包含单个 GraphQL 片段的文档或包含多个片段的文档,这些片段代表您正在写入的内容。如果您传递一个包含多个片段的文档,则还需要指定一个 fragmentName
。
签名
function writeFragment(options: DataProxy.WriteFragmentOptions<TData, TVariables>): Reference | undefined
参数
结果
Reference | undefined
显示/隐藏子属性
watchFragment
由于3.10.0
根据指定的选项监视片段缓存存储,并返回一个Observable
。我们可以订阅这个Observable
,并在缓存存储发生变化时通过观察者接收更新结果。
您必须传递一个包含单个 GraphQL 片段的文档或包含多个片段的文档,这些片段代表您正在读取的内容。如果您传递一个包含多个片段的文档,则还必须指定一个 fragmentName
。
签名
function watchFragment(options: WatchFragmentOptions<TFragmentData, TVariables>): Observable<WatchFragmentResult<TFragmentData>>
参数
options
WatchFragmentOptions<TFragmentData, TVariables>
一个WatchFragmentOptions
类型的对象,允许缓存识别片段,并可选地指定是否响应乐观更新。
显示/隐藏子属性
DocumentNode | TypedDocumentNode<TFragmentData, TVariables>
一个GraphQL
片段文档,使用gql
模板字面量解析为AST。
StoreObject | Reference | string
一个包含__typename
和主键字段(例如id
)的对象,这些字段标识了实体对象,从该对象中检索片段,或者一个{ __ref: "..." }
引用,或者一个string
ID(罕见)。
在片段文档中定义的片段的名称。
如果片段文档包含多个片段,则必需,否则为可选。
boolean
如果设置为true
,则watchFragment
返回乐观结果。
默认值是true
。
TVariables
GraphQL片段可能依赖的任何变量。
结果
Observable<WatchFragmentResult<TFragmentData>>
通过清除缓存并重新执行所有活动查询来重置你的整个存储。这确保了你调用此方法之前的时间段没有数据留在你的存储中。
resetStore()
在用户刚刚登出时很有用。你已经删除了用户会话,现在你想要确保所有可能存在的数据引用都已删除。
重要的是要记住,resetStore()
将重新检索所有活动查询。这意味着任何已挂载的组件将再次使用你的网络接口执行它们的查询。如果你不想重新执行任何查询,那么你应该确保停止监视任何活动查询。
签名
function resetStore(): Promise<ApolloQueryResult<any>[] | null>
结果
Promise<ApolloQueryResult<any>[] | null>
允许注册回调函数,当存储重置时执行。 onResetStore
返回一个解绑函数,可以用来移除已注册的回调。
签名
function onResetStore(cb: () => Promise<any>): () => void
参数
结果
() => void
从存储中删除所有数据。与resetStore
不同,clearStore
不会重新检索任何活动查询。
签名
function clearStore(): Promise<any[]>
结果
Promise<any[]>
允许注册回调,在存储清除时执行。onClearStore
返回一个取消订阅的函数,可用于移除已注册的回调。
签名
function onClearStore(cb: () => Promise<any>): () => void
参数
结果
() => void
调用此方法以终止任何活动客户端进程,使此 ApolloClient
实例变得安全以确保释放。
签名
function stop(): void
重新获取所有活动查询。
reFetchObservableQueries()
当网络中断时,如果要使客户端返回到正确状态,则很有用。
重要的是要记住,reFetchObservableQueries()
将重新获取任何活动查询。这意味着任何可能会挂载的组件将使用您的网络接口重新执行它们自己的查询。如果您不希望重新执行任何查询,请务必停止监视任何活动查询。接受可选参数includeStandby
,当重新获取时将包括处于备用模式的查询。
签名
function reFetchObservableQueries(includeStandby?: boolean): Promise<ApolloQueryResult<any>[]>
参数
结果
Promise<ApolloQueryResult<any>[]>
重新获取指定的活动查询。类似于"reFetchObservableQueries()",但有特定的查询列表。
refetchQueries()
对于强制刷新选定查询的用例很有用。
重要的是要记住,refetchQueries()
将重新获取指定的活动查询。这意味着任何可能会挂载的组件将使用您的网络接口重新执行它们的查询。如果您不希望重新执行任何查询,请确保停止监视任何活动查询。
签名
function refetchQueries(options: RefetchQueriesOptions<TCache, TResult>): RefetchQueriesResult<TResult>
参数
options
RefetchQueriesOptions<TCache, TResult>
显示/隐藏子属性
重新获取查询包含项
OnQueryUpdated<TResult> | null
boolean
(cache: TCache) => void
结果
RefetchQueriesResult<TResult>
显示/隐藏子属性
(警告:由于复杂的继承,某些属性可能未显示在表格中!)
获取所有当前活动 ObservableQuery
对象,在按查询 ID 字符串键的 Map
中。
"活动" 查询指的是具有观察者和fetchPolicy
不是"备用"或"仅缓存"的查询。
您可以通过传递"all"而不是"active"来包含所有 ObservableQuery
对象(包括非活动对象),或者您可以传递一个查询名称数组或文档节点对象。
签名
function getObservableQueries(include?: RefetchQueriesInclude): Map<string, ObservableQuery<any>>
参数
结果
Map<string, ObservableQuery<any>>
类型
属性
ApolloCache<TCacheShape>
Apollo客户端应使用以本地存储查询结果的缓存。推荐的缓存是InMemoryCache
,该缓存由@apollo/client
包提供。
有关更多信息,请参阅配置缓存。
ApolloLink
您可以为Apollo客户端的网络层提供一个ApolloLink
实例。有关更多信息,请参阅高级HTTP网络。
必需提供一个uri
或link
。如果您都提供了,link
将优先。
string | UriFunction
GraphQL端点URI,Apollo客户端将与之通信。
必需提供一个uri
或link
。如果您都提供了,link
将优先。
boolean
⚠️ 已弃用
请使用devtools.enabled
选项。
如果true
,Apollo Client Devtools浏览器扩展可以连接到Apollo Client。
生产环境的默认值是false
,开发环境(如果有window
对象)的默认值是true
。
DefaultOptions
提供此对象以设置应用程序级别的默认选项,您可以将其提供给watchQuery
、query
和mutate
函数。下面是一个示例对象。
请参阅此示例对象。
字符串
一个自定义名称(例如,iOS
)用于在您的一系列客户中识别此特定客户。Apollo 服务器和 Apollo 工作室使用此属性作为客户端识别功能的一部分。
字符串
一个自定义版本,用于识别此特定客户端的当前版本(例如,1.2
)。Apollo 服务器和 Apollo 工作室使用此属性作为客户端识别功能的一部分。
这不是您使用的 Apollo 客户端版本,而是任何有助于您区分客户端不同版本的字符串。
boolean
如果为true
,Apollo 客户端将假设从缓存中读取的结果永远不会被应用程序代码修改,从而实现大量的性能优化。
Partial
DevtoolsOptions
用于此客户端的Apollo 客户端开发工具扩展的配置。
DocumentTransform
FragmentMatcher
Record
一个对象,表示要包含在每次 HTTP 请求中的头信息,例如{Authorization: 'Bearer 1234'}
当使用link
选项时,此值将被忽略。
boolean
如果为false
,则 Apollo 客户端会向服务器发送每个创建的查询,即使完全相同的查询(查询字符串、变量值和操作名称完全相同)已经在飞行中。
Resolvers | Resolvers[]
number
在服务器端渲染之后,Apollo 客户端强制获取查询之前的时间间隔(以毫秒为单位)。
boolean
当使用Apollo Client进行服务器端渲染时,将此设置为true
,以便getDataFromTree
函数可以有效地工作。
string | string[] | DocumentNode | DocumentNode[]
属性
Partial<MutationOptions<any, any, any>>
Partial<QueryOptions<any, any>>
Partial<WatchQueryOptions<any, any>>
示例 defaultOptions
对象
const defaultOptions = {watchQuery: {fetchPolicy: 'cache-and-network',errorPolicy: 'ignore',},query: {fetchPolicy: 'network-only',errorPolicy: 'all',},mutate: {errorPolicy: 'all',},};
您可以通过在单个函数调用中提供不同的值来覆盖此对象中指定的任何默认选项。
注意: useQuery
钩子使用 Apollo Client 的 watchQuery
函数。要使用 useQuery
钩子设置 defaultOptions
,请确保在 defaultOptions.watchQuery
属性下设置。