Hooks
Apollo Client react hooks API reference
The ApolloProvider component
ApolloProvider componentThe ApolloProvider component leverages @apollo/client package.
import { ApolloProvider } from '@apollo/client';
Props
| Option | Type | Description |
|---|---|---|
client | ApolloClient<TCache> | An ApolloClient instance. |
Example
const client = new ApolloClient({cache: new InMemoryCache(),uri: "http://localhost:4000/graphql"});ReactDOM.render(<ApolloProvider client={client}><MyRootComponent /></ApolloProvider>,document.getElementById('root'),);
The ApolloConsumer component
ApolloConsumer componentOne way to access the configured Apollo Client instance directly is to create an ApolloConsumer component and provide a render prop function as its child. The render prop function will be called with your ApolloClient instance as its only argument. You can think of the ApolloConsumer component as similar to the Consumer component from the
Example
import { ApolloConsumer } from '@apollo/client';function WithApolloClient() {return (<ApolloConsumer>{client => 'We have access to the client!' /* do stuff here */}</ApolloConsumer>);}
useQuerySince 3.0.0
useQueryA hook for executing queries in an Apollo application.
To run a query within a React component, call useQuery and pass it a GraphQL query document.
When your component renders, useQuery returns an object from Apollo Client that contains loading, error, and data properties you can use to render your UI.
Refer to the useQuery.
Example
import { gql, useQuery } from '@apollo/client';const GET_GREETING = gql`query GetGreeting($language: String!) {greeting(language: $language) {message}}`;function Hello() {const { loading, error, data } = useQuery(GET_GREETING, {variables: { language: 'english' },});if (loading) return <p>Loading ...</p>;return <h1>Hello {data.greeting.message}!</h1>;}
Signature
function useQuery<TData, TVariables>(query: DocumentNode | TypedDocumentNode<TData, TVariables>,options?: QueryHookOptions<NoInfer<TData>, NoInfer<TVariables>>): QueryResult<TData, TVariables>
Parameters
query
DocumentNode | TypedDocumentNode<TData, TVariables>A GraphQL query document parsed into an AST by gql.
options (optional)
QueryHookOptions<NoInfer<TData>, NoInfer<TVariables>>Options to control how the query is executed.
Show/hide child attributes
ApolloClient<any>The instance of ApolloClient to use to execute the query.
By default, the instance that's passed down via context is used, but you can provide a different instance here.
ErrorPolicySpecifies how the query handles a response that returns both GraphQL errors and partial results.
For details, see
The default value is none, meaning that the query result includes error details but not partial results.
(data: NoInfer<TData>) => voidA callback function that's called when your query successfully completes with zero errors (or if errorPolicy is ignore and partial data is returned).
This function is passed the query's result data.
(error: ApolloError) => voidA callback function that's called when the query encounters one or more errors (unless errorPolicy is ignore).
This function is passed an ApolloError object that contains either a networkError object or a graphQLErrors array, depending on the error(s) that occurred.
booleanIf true, the query is not executed.
The default value is false.
NoInfer<TVariables>An object containing all of the GraphQL variables your query requires to execute.
Each key in the object corresponds to a variable name, and that key's value corresponds to the variable value.
DefaultContextIf you're using context object that's passed along your link chain.
If true, the in-progress query's associated component re-renders whenever the network status changes or a network error occurs.
The default value is false.
numberSpecifies the interval (in milliseconds) at which the query polls for updated results.
The default value is 0 (no polling).
() => booleanA callback function that's called whenever a refetch attempt occurs while polling. If the function returns true, the refetch is skipped and not reattempted until the next poll interval.
booleanPass false to skip executing the query during
WatchQueryFetchPolicySpecifies how the query interacts with the Apollo Client cache during execution (for example, whether it checks the cache for results before sending a request to the server).
For details, see
The default value is cache-first.
WatchQueryFetchPolicyDefaults to the initial value of options.fetchPolicy, but can be explicitly configured to specify the WatchQueryFetchPolicy to revert back to whenever variables change (unless nextFetchPolicy intervenes).
WatchQueryFetchPolicy | ((this: WatchQueryOptions<NoInfer<TVariables>, NoInfer<TData>>, currentFetchPolicy: WatchQueryFetchPolicy, context: NextFetchPolicyContext<NoInfer<TData>, NoInfer<TVariables>>) => WatchQueryFetchPolicy)Specifies the FetchPolicy to be used after this query has completed.
RefetchWritePolicySpecifies whether a NetworkStatus.refetch operation should merge incoming field data with existing data, or overwrite the existing data. Overwriting is probably preferable, but merging is currently the default behavior, for backwards compatibility with Apollo Client 3.x.
booleanIf true, the query can return partial results from the cache if the cache doesn't contain results for all queried fields.
The default value is false.
boolean⚠️ Deprecated
Using canonizeResults can result in memory leaks so we generally do not recommend using this option anymore. A future version of Apollo Client will contain a similar feature without the risk of memory leaks.
Whether to canonize cache results before returning them. Canonization takes some extra time, but it speeds up future deep equality comparisons. Defaults to false.
boolean⚠️ Deprecated
Setting this option is unnecessary in Apollo Client 3, thanks to a more consistent application of fetch policies. It might be removed in a future release.
If true, causes a query refetch if the query result is detected as partial.
The default value is false.
Result
Query result objectQueryResult<TData, TVariables>
Show/hide child attributes
TData | undefinedAn object containing the result of your GraphQL query after it completes.
This value might be undefined if a query results in one or more errors (depending on the query's errorPolicy).
ApolloErrorIf the query produces one or more errors, this object contains either an array of graphQLErrors or a single networkError. Otherwise, this value is undefined.
For more information, see
An object containing the result from the most recent previous execution of this query.
This value is undefined if this is the query's first execution.
TVariables | undefinedAn object containing the variables that were provided for the query.
booleanIf true, the associated lazy query has been executed.
This field is only present on the result object returned by useLazyQuery
ApolloClient<any>The instance of Apollo Client that executed the query. Can be useful for manually executing followup queries or writing data to the cache.
booleanIf true, the query is still in flight and results have not yet been returned.
NetworkStatusA number indicating the current network state of the query's associated request.
Used in conjunction with the notifyOnNetworkStatusChange
<TFetchData = TData, TFetchVars extends OperationVariables = TVariables>(fetchMoreOptions: FetchMoreQueryOptions<TFetchVars, TFetchData> & {
updateQuery?: (previousQueryResult: TData, options: {
fetchMoreResult: TFetchData;
variables: TFetchVars;
}) => TData;
}) => Promise<ApolloQueryResult<TFetchData>>A function that helps you fetch the next set of results for a
(variables?: Partial<TVariables>) => Promise<ApolloQueryResult<TData>>A function that enables you to re-execute the query, optionally passing in new variables.
To guarantee that the refetch performs a network request, its fetchPolicy is set to network-only (unless the original query's fetchPolicy is no-cache or cache-and-network, which also guarantee a network request).
See also
(pollInterval: number) => voidA function that instructs the query to begin re-executing at a specified interval (in milliseconds).
() => voidA function that instructs the query to stop polling after a previous call to startPolling.
<TSubscriptionData = TData, TSubscriptionVariables extends OperationVariables = TVariables>(options: SubscribeToMoreOptions<TData, TSubscriptionVariables, TSubscriptionData>) => () => voidA function that enables you to execute a
This function returns another function that you can call to terminate the subscription.
<TVars extends OperationVariables = TVariables>(mapFn: (previousQueryResult: TData, options: Pick<WatchQueryOptions<TVars, TData>, "variables">) => TData) => voidA function that enables you to update the query's cached result without executing a followup GraphQL operation.
See
ObservableQuery<TData, TVariables>A reference to the internal ObservableQuery used by the hook.
useLazyQuerySince 3.0.0
useLazyQueryA hook for imperatively executing queries in an Apollo application, e.g. in response to user interaction.
Refer to the useLazyQuery.
Example
import { gql, useLazyQuery } from "@apollo/client";const GET_GREETING = gql`query GetGreeting($language: String!) {greeting(language: $language) {message}}`;function Hello() {const [loadGreeting, { called, loading, data }] = useLazyQuery(GET_GREETING,{ variables: { language: "english" } });if (called && loading) return <p>Loading ...</p>if (!called) {return <button onClick={() => loadGreeting()}>Load greeting</button>}return <h1>Hello {data.greeting.message}!</h1>;}
Signature
function useLazyQuery<TData, TVariables>(query: DocumentNode | TypedDocumentNode<TData, TVariables>,options?: LazyQueryHookOptions<NoInfer<TData>, NoInfer<TVariables>>): LazyQueryResultTuple<TData, TVariables>
Parameters
query
DocumentNode | TypedDocumentNode<TData, TVariables>A GraphQL query document parsed into an AST by gql.
options (optional)
LazyQueryHookOptions<NoInfer<TData>, NoInfer<TVariables>>Default options to control how the query is executed.
Show/hide child attributes
ApolloClient<any>The instance of ApolloClient to use to execute the query.
By default, the instance that's passed down via context is used, but you can provide a different instance here.
ErrorPolicySpecifies how the query handles a response that returns both GraphQL errors and partial results.
For details, see
The default value is none, meaning that the query result includes error details but not partial results.
(data: NoInfer<TData>) => voidA callback function that's called when your query successfully completes with zero errors (or if errorPolicy is ignore and partial data is returned).
This function is passed the query's result data.
(error: ApolloError) => voidA callback function that's called when the query encounters one or more errors (unless errorPolicy is ignore).
This function is passed an ApolloError object that contains either a networkError object or a graphQLErrors array, depending on the error(s) that occurred.
NoInfer<TVariables>An object containing all of the GraphQL variables your query requires to execute.
Each key in the object corresponds to a variable name, and that key's value corresponds to the variable value.
DefaultContextIf you're using context object that's passed along your link chain.
If true, the in-progress query's associated component re-renders whenever the network status changes or a network error occurs.
The default value is false.
numberSpecifies the interval (in milliseconds) at which the query polls for updated results.
The default value is 0 (no polling).
() => booleanA callback function that's called whenever a refetch attempt occurs while polling. If the function returns true, the refetch is skipped and not reattempted until the next poll interval.
booleanPass false to skip executing the query during
WatchQueryFetchPolicySpecifies how the query interacts with the Apollo Client cache during execution (for example, whether it checks the cache for results before sending a request to the server).
For details, see
The default value is cache-first.
WatchQueryFetchPolicyDefaults to the initial value of options.fetchPolicy, but can be explicitly configured to specify the WatchQueryFetchPolicy to revert back to whenever variables change (unless nextFetchPolicy intervenes).
WatchQueryFetchPolicy | ((this: WatchQueryOptions<NoInfer<TVariables>, NoInfer<TData>>, currentFetchPolicy: WatchQueryFetchPolicy, context: NextFetchPolicyContext<NoInfer<TData>, NoInfer<TVariables>>) => WatchQueryFetchPolicy)Specifies the FetchPolicy to be used after this query has completed.
RefetchWritePolicySpecifies whether a NetworkStatus.refetch operation should merge incoming field data with existing data, or overwrite the existing data. Overwriting is probably preferable, but merging is currently the default behavior, for backwards compatibility with Apollo Client 3.x.
booleanIf true, the query can return partial results from the cache if the cache doesn't contain results for all queried fields.
The default value is false.
boolean⚠️ Deprecated
Using canonizeResults can result in memory leaks so we generally do not recommend using this option anymore. A future version of Apollo Client will contain a similar feature without the risk of memory leaks.
Whether to canonize cache results before returning them. Canonization takes some extra time, but it speeds up future deep equality comparisons. Defaults to false.
boolean⚠️ Deprecated
Setting this option is unnecessary in Apollo Client 3, thanks to a more consistent application of fetch policies. It might be removed in a future release.
If true, causes a query refetch if the query result is detected as partial.
The default value is false.
Result
[execute: LazyQueryExecFunction<TData, TVariables>, result: QueryResult<TData, TVariables>]
A tuple of two values:
| Name | Type | Description |
| execute | (options?: LazyQueryHookOptions<TVariables>) => Promise<LazyQueryResult<TData, TVariables>> | Function that can be triggered to execute the suspended query. After being called, `useLazyQuery` behaves just like `useQuery`. The `useLazyQuery` function returns a promise that fulfills with a query result when the query succeeds or fails. |
| result | QueryResult<TData, TVariables> | The result of the query. See the `useQuery` hook for more details. |
Show/hide child attributesOperation data TData | undefinedAn object containing the result of your GraphQL query after it completes. This value might be ApolloErrorIf the query produces one or more errors, this object contains either an array of For more information, see An object containing the result from the most recent previous execution of this query. This value is TVariables | undefinedAn object containing the variables that were provided for the query. Network info booleanIf This field is only present on the result object returned by ApolloClient<any>The instance of Apollo Client that executed the query. Can be useful for manually executing followup queries or writing data to the cache. booleanIf NetworkStatusA number indicating the current network state of the query's associated request. Used in conjunction with the Helper functions <TFetchData = TData, TFetchVars extends OperationVariables = TVariables>(fetchMoreOptions: FetchMoreQueryOptions<TFetchVars, TFetchData> & {
updateQuery?: (previousQueryResult: TData, options: {
fetchMoreResult: TFetchData;
variables: TFetchVars;
}) => TData;
}) => Promise<ApolloQueryResult<TFetchData>>A function that helps you fetch the next set of results for a (variables?: Partial<TVariables>) => Promise<ApolloQueryResult<TData>>A function that enables you to re-execute the query, optionally passing in new To guarantee that the refetch performs a network request, its See also (pollInterval: number) => voidA function that instructs the query to begin re-executing at a specified interval (in milliseconds). () => voidA function that instructs the query to stop polling after a previous call to <TSubscriptionData = TData, TSubscriptionVariables extends OperationVariables = TVariables>(options: SubscribeToMoreOptions<TData, TSubscriptionVariables, TSubscriptionData>) => () => voidA function that enables you to execute a This function returns another function that you can call to terminate the subscription. <TVars extends OperationVariables = TVariables>(mapFn: (previousQueryResult: TData, options: Pick<WatchQueryOptions<TVars, TData>, "variables">) => TData) => voidA function that enables you to update the query's cached result without executing a followup GraphQL operation. See Other ObservableQuery<TData, TVariables>A reference to the internal | ||
useMutationSince 3.0.0
useMutationRefer to the useMutation.
Example
import { gql, useMutation } from '@apollo/client';const ADD_TODO = gql`mutation AddTodo($type: String!) {addTodo(type: $type) {idtype}}`;function AddTodo() {let input;const [addTodo, { data }] = useMutation(ADD_TODO);return (<div><formonSubmit={e => {e.preventDefault();addTodo({ variables: { type: input.value } });input.value = '';}}><inputref={node => {input = node;}}/><button type="submit">Add Todo</button></form></div>);}
Signature
function useMutation<TData, TVariables, TContext, TCache>(mutation: DocumentNode | TypedDocumentNode<TData, TVariables>,options?: MutationHookOptions<NoInfer<TData>, NoInfer<TVariables>, TContext, TCache>): MutationTuple<TData, TVariables, TContext, TCache>
Parameters
mutation
DocumentNode | TypedDocumentNode<TData, TVariables>A GraphQL mutation document parsed into an AST by gql.
options (optional)
MutationHookOptions<NoInfer<TData>, NoInfer<TVariables>, TContext, TCache>Options to control how the mutation is executed.
Show/hide child attributes
If true, makes sure all queries included in refetchQueries are completed before the mutation is considered complete.
The default value is false (queries are refetched asynchronously).
ErrorPolicySpecifies how the mutation handles a response that returns both GraphQL errors and partial results.
For details, see
The default value is none, meaning that the mutation result includes error details but not partial results.
booleanIf true, the mutation's data property is not updated with the mutation's result.
The default value is false.
(data: NoInfer<TData>, clientOptions?: BaseMutationOptions) => voidA callback function that's called when your mutation successfully completes with zero errors (or if errorPolicy is ignore and partial data is returned).
This function is passed the mutation's result data and any options passed to the mutation.
(error: ApolloError, clientOptions?: BaseMutationOptions) => voidA callback function that's called when the mutation encounters one or more errors (unless errorPolicy is ignore).
This function is passed an ApolloErrornetworkError object or a graphQLErrors array, depending on the error(s) that occurred, as well as any options passed the mutation.
OnQueryUpdated<any>Optional callback for intercepting queries whose cache data has been updated by the mutation, as well as any queries specified in the refetchQueries: [...] list passed to client.mutate.
Returning a Promise from onQueryUpdated will cause the final mutation Promise to await the returned Promise. Returning false causes the query to be ignored.
((result: FetchResult<NoInfer<TData>>) => InternalRefetchQueriesInclude) | InternalRefetchQueriesIncludeAn array (or a function that returns an array) that specifies which queries you want to refetch after the mutation occurs.
Each array value can be either:
An object containing the
queryto execute, along with anyvariablesA string indicating the operation name of the query to refetch
NoInfer<TVariables>An object containing all of the GraphQL variables your mutation requires to execute.
Each key in the object corresponds to a variable name, and that key's value corresponds to the variable value.
ApolloClient<object>The instance of ApolloClient to use to execute the mutation.
By default, the instance that's passed down via context is used, but you can provide a different instance here.
TContextIf you're using context object that's passed along your link chain.
If true, the in-progress mutation's associated component re-renders whenever the network status changes or a network error occurs.
The default value is false.
MutationFetchPolicyProvide no-cache if the mutation's result should not be written to the Apollo Client cache.
The default value is network-only (which means the result is written to the cache).
Unlike queries, mutations do not support network-only and no-cache.
NoInfer<TData> | ((vars: NoInfer<TVariables>, { IGNORE }: {
IGNORE: IgnoreModifier;
}) => NoInfer<TData>)By providing either an object or a callback function that, when invoked after a mutation, allows you to return optimistic data and optionally skip updates via the IGNORE sentinel object, Apollo Client caches this temporary (and potentially incorrect) response until the mutation completes, enabling more responsive UI updates.
For more information, see
MutationUpdaterFunction<NoInfer<TData>, NoInfer<TVariables>, TContext, TCache>A function used to update the Apollo Client cache after the mutation completes.
For more information, see
booleanTo avoid retaining sensitive information from mutation root field arguments, Apollo Client v3.4+ automatically clears any ROOT_MUTATION fields from the cache after each mutation finishes. If you need this information to remain in the cache, you can prevent the removal by passing keepRootFields: true to the mutation. ROOT_MUTATION result data are also passed to the mutation update function, so we recommend obtaining the results that way, rather than using this option, if possible.
MutationQueryReducersMap<NoInfer<TData>>A MutationQueryReducersMap, which is map from query names to mutation query reducers. Briefly, this map defines how to incorporate the results of the mutation into the results of queries that are currently being watched by your application.
Result
[mutate: (options?: MutationFunctionOptions<TData, TVariables>) => Promise<FetchResult<TData>>,result: MutationResult<TData>]
| Name | Type | Description |
| mutate | (
options?: MutationFunctionOptions<TData, TVariables>
) => Promise<FetchResult<TData>> | A function to trigger the mutation from your UI. You can optionally pass this function any of the following options:
Any option you pass here overrides any existing value for that option that you passed to The mutate function returns a promise that fulfills with your mutation result. |
| result | MutationResult<TData> | The result of the mutation. |
Show/hide child attributesOther booleanIf ApolloClient<object>The instance of Apollo Client that executed the mutation. Can be useful for manually executing followup operations or writing data to the cache. TData | nullThe data returned from your mutation. Can be ApolloErrorIf the mutation produces one or more errors, this object contains either an array of For more information, see booleanIf () => voidA function that you can call to reset the mutation's result to its initial, uncalled state. | ||
useSubscriptionSince 3.0.0
useSubscriptionRefer to the useSubscription.
Subscriptions and React 18 Automatic Batching
With React 18's
If your subscription API sends multiple messages at the same time or in very fast succession (within fractions of a millisecond), it is likely that only the last message received in that narrow time frame will result in a re-render.
Consider the following component:
export function Subscriptions() {const { data, error, loading } = useSubscription(query);const [accumulatedData, setAccumulatedData] = useState([]);useEffect(() => {setAccumulatedData((prev) => [...prev, data]);}, [data]);return (<>{loading && <p>Loading...</p>}{JSON.stringify(accumulatedData, undefined, 2)}</>);}
If your subscription back-end emits two messages with the same timestamp, only the last message received by Apollo Client will be rendered. This is because React 18 will batch these two state updates into a single re-render.
Since the component above is using useEffect to push data into a piece of local state on each Subscriptions re-render, the first message will never be added to the accumulatedData array since its render was skipped.
Instead of using useEffect here, we can re-write this component to use the onData callback function accepted in useSubscription's options object:
export function Subscriptions() {const [accumulatedData, setAccumulatedData] = useState([]);const { data, error, loading } = useSubscription(query,{onData({ data }) {setAccumulatedData((prev) => [...prev, data])}});return (<>{loading && <p>Loading...</p>}{JSON.stringify(accumulatedData, undefined, 2)}</>);}
⚠️ Note: The useSubscription option onData is available in Apollo Client >= 3.7. In previous versions, the equivalent option is named onSubscriptionData.
Now, the first message will be added to the accumulatedData array since onData is called before the component re-renders. React 18 automatic batching is still in effect and results in a single re-render, but with onData we can guarantee each message received after the component mounts is added to accumulatedData.
Example
const COMMENTS_SUBSCRIPTION = gql`subscription OnCommentAdded($repoFullName: String!) {commentAdded(repoFullName: $repoFullName) {idcontent}}`;function DontReadTheComments({ repoFullName }) {const {data: { commentAdded },loading,} = useSubscription(COMMENTS_SUBSCRIPTION, { variables: { repoFullName } });return <h4>New comment: {!loading && commentAdded.content}</h4>;}
Signature
function useSubscription<TData, TVariables>(subscription: DocumentNode | TypedDocumentNode<TData, TVariables>,options?: SubscriptionHookOptions<NoInfer<TData>, NoInfer<TVariables>>): SubscriptionResult<TData, TVariables>
Parameters
subscription
DocumentNode | TypedDocumentNode<TData, TVariables>A GraphQL subscription document parsed into an AST by gql.
options (optional)
SubscriptionHookOptions<NoInfer<TData>, NoInfer<TVariables>>Options to control how the subscription is executed.
Show/hide child attributes
ApolloClient<object>An ApolloClient instance. By default useSubscription / Subscription uses the client passed down via context, but a different client can be passed in.
DefaultContextShared context between your component and your network interface (Apollo Link).
FetchPolicyHow you want your component to interact with the Apollo cache. For details, see
() => voidAllows the registration of a callback function that will be triggered each time the useSubscription Hook / Subscription component completes the subscription.
(options: OnDataOptions<NoInfer<TData>>) => anyAllows the registration of a callback function that will be triggered each time the useSubscription Hook / Subscription component receives data. The callback options object param consists of the current Apollo Client instance in client, and the received subscription data in data.
(error: ApolloError) => voidAllows the registration of a callback function that will be triggered each time the useSubscription Hook / Subscription component receives an error.
boolean | ((options: BaseSubscriptionOptions<NoInfer<TData>, NoInfer<TVariables>>) => boolean)Determines if your subscription should be unsubscribed and subscribed again when an input to the hook (such as subscription or variables) changes.
booleanDetermines if the current subscription should be skipped. Useful if, for example, variables depend on previous queries and are not ready yet.
NoInfer<TVariables>An object containing all of the variables your subscription needs to execute
() => void⚠️ Deprecated
Use onComplete instead
Allows the registration of a callback function that will be triggered when the useSubscription Hook / Subscription component completes the subscription.
(options: OnSubscriptionDataOptions<NoInfer<TData>>) => any⚠️ Deprecated
Use onData instead
Allows the registration of a callback function that will be triggered each time the useSubscription Hook / Subscription component receives data. The callback options object param consists of the current Apollo Client instance in client, and the received subscription data in subscriptionData.
Result
Query result objectSubscriptionResult<TData, TVariables>
Show/hide child attributes
TDataAn object containing the result of your GraphQL subscription. Defaults to an empty object.
ApolloErrorA runtime error with graphQLErrors and networkError properties
booleanA boolean that indicates whether any initial data has been returned
useApolloClientSince 3.0.0
useApolloClientExample
import { useApolloClient } from '@apollo/client';function SomeComponent() {const client = useApolloClient();// `client` is now set to the `ApolloClient` instance being used by the// application (that was configured using something like `ApolloProvider`)}
Signature
function useApolloClient(override?: ApolloClient<object>): ApolloClient<object>
Parameters
Result
The `ApolloClient` instance being used by the application.ApolloClient<object>
useReactiveVarSince 3.2.0
useReactiveVarReads the value of a useQuery hook.
Example
import { makeVar, useReactiveVar } from "@apollo/client";export const cartItemsVar = makeVar([]);export function Cart() {const cartItems = useReactiveVar(cartItemsVar);// ...}
Signature
function useReactiveVar<T>(rv: ReactiveVar<T>): T
Parameters
rv
ReactiveVar<T>A reactive variable.
Show/hide child attributes
(
cache: ApolloCache<any>
) => this(
cache: ApolloCache<any>
) => boolean(
listener: ReactiveListener<T>
) => () => voidResult
The current value of the reactive variable.T
useFragmentSince 3.8.0
useFragmentuseFragment represents a lightweight live binding into the Apollo Client Cache and enables Apollo Client to broadcast very specific fragment results to individual components. This hook returns an always-up-to-date view of whatever data the cache currently contains for a given fragment. useFragment never triggers network requests of its own.
Note that the useQuery hook remains the primary hook responsible for querying and populating data in the cache (useFragment is still subscribed to all changes in the query data, but receives updates only when that fragment's specific data change.
Note: this hook was introduced in 3.7.0 as experimental but stabilized in 3.8.0. In 3.7.x and 3.8.0-alpha.x releases, this hook is exported as useFragment_experimental. Starting with 3.8.0-beta.0 and greater the _experimental suffix was removed in its named export.
Example
To view a useFragment example, see the
Function Signature
function useFragment<TData = any,TVars = OperationVariables>({from: string | StoreObject | Reference;fragment: DocumentNode | TypedDocumentNode<TData, TVars>;fragmentName?: string;optimistic?: boolean;variables?: TVars;returnPartialData?: boolean;}): UseFragmentResult<TData> {}
Params
options
options| Name / Type | Description |
|---|---|
Operation options | |
from
| Required. An object containing a |
fragment
| Required. A GraphQL fragment document parsed into an AST with the |
fragmentName
| The name of the fragment defined in the Required if the |
optimistic
| If The default value is |
variables
| An object containing all of the GraphQL variables your fragment requires. Each key in the object corresponds to a variable name, and that key's value corresponds to the variable value. |
canonizeResults
| ⚠️ Deprecated:
Using If The default value is |
Result
| Name / Type | Description |
|---|---|
Operation result | |
data
| An object containing the data for a given GraphQL fragment. This value might be |
complete
| A boolean indicating whether the data returned for the fragment is complete. When |
missing
| A tree of all |
useSuspenseQuerySince 3.8.0
useSuspenseQueryFor a detailed explanation of useSuspenseQuery, see the
Example
import { Suspense } from 'react';import { useSuspenseQuery } from '@apollo/client';const listQuery = gql`query {list {id}}`;function App() {return (<Suspense fallback={<Spinner />}><List /></Suspense>);}function List() {const { data } = useSuspenseQuery(listQuery);return (<ol>{data.list.map(item => <Item key={item.id} id={item.id}/>)}</ol>);}
Signature
function useSuspenseQuery<TData, TVariables>(query: DocumentNode,options?: SuspenseQueryHookOptions<TData, TVariables> | SkipToken,): UseSuspenseQueryResult<TData, TVariables>
Params
query
query| Param | Type | Description |
|---|---|---|
query | (Typed)DocumentNode | A GraphQL query document parsed into an AST by gql. |
options
optionsInstead of passing a SuspenseQueryHookOptions object into the hook, you can also pass a skipTokenuseSuspenseQuery hook from executing the query or suspending.
Properties
TVariablesAn object containing all of the GraphQL variables your query requires to execute.
Each key in the object corresponds to a variable name, and that key's value corresponds to the variable value.
ErrorPolicySpecifies how the query handles a response that returns both GraphQL errors and partial results.
For details, see
The default value is none, meaning that the query result includes error details but not partial results.
boolean⚠️ Deprecated
We recommend using skipToken in place of the skip option as it is more type-safe.
This option is deprecated and only supported to ease the migration from useQuery. It will be removed in a future release.
If true, the query is not executed. The default value is false.
ApolloClient<any>The instance of ApolloClient to use to execute the query.
By default, the instance that's passed down via context is used, but you can provide a different instance here.
string | number | any[]A unique identifier for the query. Each item in the array must be a stable identifier to prevent infinite fetches.
This is useful when using the same query and variables combination in more than one component, otherwise the components may clobber each other. This can also be used to force the query to re-evaluate fresh.
DefaultContextIf you're using context object that's passed along your link chain.
SuspenseQueryHookFetchPolicySpecifies how the query interacts with the Apollo Client cache during execution (for example, whether it checks the cache for results before sending a request to the server).
For details, see
The default value is cache-first.
RefetchWritePolicyWatched queries must opt into overwriting existing data on refetch, by passing refetchWritePolicy: "overwrite" in their WatchQueryOptions.
The default value is "overwrite".
booleanIf true, the query can return partial results from the cache if the cache doesn't contain results for all queried fields.
The default value is false.
boolean⚠️ Deprecated
Using canonizeResults can result in memory leaks so we generally do not recommend using this option anymore. A future version of Apollo Client will contain a similar feature without the risk of memory leaks.
Whether to canonize cache results before returning them. Canonization takes some extra time, but it speeds up future deep equality comparisons. Defaults to false.
Result
| Name / Type | Description |
Operation result | |
data
| An object containing the result of your GraphQL query after it completes. This value might be |
error
| If the query produces one or more errors, this object contains either an array of This property can be ignored when using the default |
networkStatus
| A number indicating the current network state of the query's associated request. |
Client | |
client
| The instance of Apollo Client that executed the query. Can be useful for manually executing followup queries or writing data to the cache. |
Helper functions | |
refetch
| A function that enables you to re-execute the query, optionally passing in new To guarantee that the refetch performs a network request, its Calling this function will cause the component to re-suspend, unless the call site is wrapped in |
fetchMore
| A function that helps you fetch the next set of results for a Calling this function will cause the component to re-suspend, unless the call site is wrapped in |
subscribeToMore
| A function that enables you to execute a This function returns another function that you can call to terminate the subscription. |
useBackgroundQuerySince 3.8.0
useBackgroundQueryFor a detailed explanation of useBackgroundQuery, see the
Example
import { Suspense } from 'react';import {ApolloClient,InMemoryCache,useBackgroundQuery,useReadQuery,} from '@apollo/client';const query = gql`foo {bar}`;const client = new ApolloClient({uri: "http://localhost:4000/graphql",cache: new InMemoryCache()});function SuspenseFallback() {return <div>Loading...</div>;}function Child({ queryRef }) {const { data } = useReadQuery(queryRef);return <div>{data.foo.bar}</div>;}function Parent() {const [queryRef] = useBackgroundQuery(query);return (<Suspense fallback={<SuspenseFallback />}><Child queryRef={queryRef} /></Suspense>);}function App() {return (<ApolloProvider client={client}><Parent /></ApolloProvider>);}
Signature
function useBackgroundQuery<TData, TVariables>(query: DocumentNode | TypedDocumentNode<TData, TVariables>,options: BackgroundQueryHookOptions<TData, TVariables> | SkipToken,): [// Will return `undefined` here if no query has been executed yet and the query// is currently skipped using `skipToken` or { skip: true }QueryReference<TData> | undefined,{fetchMore: FetchMoreFunction<TData, TVariables>;refetch: RefetchFunction<TData, TVariables>;}]
Params
query
query| Param | Type | Description |
|---|---|---|
query | (Typed)DocumentNode | A GraphQL query document parsed into an AST by gql. |
options
optionsInstead of passing a BackgroundQueryHookOptions object into the hook, you can also pass a skipTokenuseBackgroundQuery hook from executing the query.
If no query has been executed yet and you skip the query, the hook will return undefined instead of a queryRef.
| Name / Type | Description |
Operation options | |
variables
| An object containing all of the GraphQL variables your query requires to execute. Each key in the object corresponds to a variable name, and that key's value corresponds to the variable value. |
errorPolicy
| Specifies how the query handles a response that returns both GraphQL errors and partial results. For details, see The default value is |
Networking options | |
context
| If you're using |
canonizeResults
| ⚠️ Deprecated:
Using If The default value is |
client
| The instance of By default, the instance that's passed down via context is used, but you can provide a different instance here. |
Caching options | |
fetchPolicy
| Specifies how the query interacts with the Apollo Client cache during execution (for example, whether it checks the cache for results before sending a request to the server). For details, see The default value is |
returnPartialData
| If The default value is |
refetchWritePolicy
| Watched queries must opt into overwriting existing data on refetch, by passing The default value is |
skip (deprecated)
| If This option is deprecated and only supported to ease the migration from |
Result
| Name / Type | Description |
Query reference | |
queryRef
| In order to link a query initiated by a specific |
Helper functions | |
refetch
| A function that enables you to re-execute the query, optionally passing in new To guarantee that the refetch performs a network request, its Calling this function will cause the component to re-suspend, unless the call site is wrapped in |
fetchMore
| A function that helps you fetch the next set of results for a Calling this function will cause the component to re-suspend, unless the call site is wrapped in |
useReadQuerySince 3.8.0
useReadQueryFor a detailed explanation of useReadQuery, see the
Example
See the useBackgroundQuery section above.
Signature
function useReadQuery<TData>(queryRef: QueryReference<TData>): {data: TData;networkStatus: NetworkStatus;error: ApolloError | undefined;} {}
Params
queryRef
queryRef| Param | Type | Description |
|---|---|---|
queryRef | QueryReference | The queryRefuseBackgroundQuery. |
Result
| Name / Type | Description |
Operation result | |
data
| An object containing the result of your GraphQL query after it completes. This value might be |
error
| If the query produces one or more errors, this object contains either an array of This property can be ignored when using the default |
networkStatus
| A number indicating the current network state of the query's associated request. |
useLoadableQuerySince 3.9.0
useLoadableQueryA hook for imperatively loading a query, such as responding to a user interaction.
Refer to the useLoadableQuery.
Example
import { gql, useLoadableQuery } from "@apollo/client";const GET_GREETING = gql`query GetGreeting($language: String!) {greeting(language: $language) {message}}`;function App() {const [loadGreeting, queryRef] = useLoadableQuery(GET_GREETING);return (<><button onClick={() => loadGreeting({ language: "english" })}>Load greeting</button><Suspense fallback={<div>Loading...</div>}>{queryRef && <Hello queryRef={queryRef} />}</Suspense></>);}function Hello({ queryRef }) {const { data } = useReadQuery(queryRef);return <div>{data.greeting.message}</div>;}
Signature
function useLoadableQuery<TData, TVariables>(query: DocumentNode | TypedDocumentNode<TData, TVariables>,options?: LoadableQueryHookOptions): UseLoadableQueryResult<TData, TVariables>
Parameters
query
DocumentNode | TypedDocumentNode<TData, TVariables>A GraphQL query document parsed into an AST by gql.
options (optional)
LoadableQueryHookOptionsOptions to control how the query is executed.
Show/hide child attributes
ApolloClient<any>The instance of ApolloClient to use to execute the query.
By default, the instance that's passed down via context is used, but you can provide a different instance here.
ErrorPolicySpecifies how the query handles a response that returns both GraphQL errors and partial results.
For details, see
The default value is none, meaning that the query result includes error details but not partial results.
string | number | any[]A unique identifier for the query. Each item in the array must be a stable identifier to prevent infinite fetches.
This is useful when using the same query and variables combination in more than one component, otherwise the components may clobber each other. This can also be used to force the query to re-evaluate fresh.
DefaultContextIf you're using context object that's passed along your link chain.
LoadableQueryHookFetchPolicySpecifies how the query interacts with the Apollo Client cache during execution (for example, whether it checks the cache for results before sending a request to the server).
For details, see
The default value is cache-first.
RefetchWritePolicySpecifies whether a NetworkStatus.refetch operation should merge incoming field data with existing data, or overwrite the existing data. Overwriting is probably preferable, but merging is currently the default behavior, for backwards compatibility with Apollo Client 3.x.
booleanIf true, the query can return partial results from the cache if the cache doesn't contain results for all queried fields.
The default value is false.
boolean⚠️ Deprecated
Using canonizeResults can result in memory leaks so we generally do not recommend using this option anymore. A future version of Apollo Client will contain a similar feature without the risk of memory leaks.
Whether to canonize cache results before returning them. Canonization takes some extra time, but it speeds up future deep equality comparisons. Defaults to false.
Result
[loadQuery: LoadQueryFunction<TVariables>,queryRef: QueryReference<TData, TVariables> | null,{fetchMore: FetchMoreFunction<TData, TVariables>;refetch: RefetchFunction<TData, TVariables>;reset: ResetFunction;}]
| Name | Type | Description |
| loadQuery | LoadQueryFunction<TVariables> | A function used to imperatively load a query. Calling this function will create or update the `queryRef` returned by `useLoadableQuery`, which should be passed to `useReadQuery`. |
| queryRef | QueryReference<TData, TVariables> | null | The `queryRef` used by `useReadQuery` to read the query result. |
Show/hide child attributesOther Since 3.9.0 () => Promise<QueryReference<TData, TVariables>>A function that returns a promise that resolves when the query has finished loading. The promise resolves with the This method is useful for preloading queries in data loading routers, such as | ||
| handlers | {
fetchMore: FetchMoreFunction<TData, TVariables>;
refetch: RefetchFunction<TData, TVariables>;
reset: ResetFunction;
} | Additional handlers used for the query, such as `refetch`. |
useQueryRefHandlersSince 3.9.0
useQueryRefHandlersA React hook that returns a refetch and fetchMore function for a given queryRef.
This is useful to get access to handlers for a queryRef that was created by createQueryPreloader or when the handlers for a queryRef produced in a different component are inaccessible.
Example
const MyComponent({ queryRef }) {const { refetch, fetchMore } = useQueryRefHandlers(queryRef);// ...}
Signature
function useQueryRefHandlers<TData, TVariables>(queryRef: QueryReference<TData, TVariables>): UseQueryRefHandlersResult<TData, TVariables>
Parameters
queryRef
QueryReference<TData, TVariables>A QueryReference returned from useBackgroundQuery, useLoadableQuery, or createQueryPreloader.
Show/hide child attributes
() => Promise<QueryReference<TData, TVariables>>A function that returns a promise that resolves when the query has finished loading. The promise resolves with the QueryReference itself.
This method is useful for preloading queries in data loading routers, such as data is not exposed on the promise to discourage using the data in loader functions and exposing it to your route components. Instead, we prefer you rely on useReadQuery to access the data to ensure your component can rerender with cache updates. If you need to access raw query data, use client.query() directly.
Result
UseQueryRefHandlersResult<TData, TVariables>
Show/hide child attributes
FetchMoreFunction<TData, TVariables>A function that helps you fetch the next set of results for a
RefetchFunction<TData, TVariables>Update the variables of this observable query, and fetch the new results. This method should be preferred over setVariables in most use cases.
skipTokenSince 3.8.0
skipTokenWhile not a hook by itself, skipToken is designed to be used with useSuspenseQuery and useBackgroundQuery.
If a skipToken is passed into one of those hooks instead of the options object, that hook will not cause any requests or suspenseful behavior, while keeping the last data available.
import { skipToken, useSuspenseQuery } from '@apollo/client';const { data } = useSuspenseQuery(query,id ? { variables: { id } } : skipToken);
import { skipToken, useBackgroundQuery } from '@apollo/client';const [queryRef] = useBackgroundQuery(query,id ? { variables: { id } } : skipToken);
Note: Why do we recommend skipToken over { skip: true }?
Imagine this very common scenario for skip: You want to skip your query if a certain variable is not set. You might be tempted to write something like this:
const { data } = useSuspenseQuery(query, {variables: { id },skip: !id});
But in that case, TypeScript will complain:
Type 'number | undefined' is not assignable to type 'number'.Type 'undefined' is not assignable to type 'number'.ts(2769)
To get around that, you have to tell TypeScript to ignore the fact that id could be undefined:
const { data } = useSuspenseQuery(query, {variables: { id: id! },skip: !id});
Alternatively, you could also use some obscure default value:
const { data } = useSuspenseQuery(query, {variables: { id: id || 0 },skip: !id});
What both of these solutions have in common: They hide a potential bug. If your skip logic becomes more complex in the future, you might accidentally introduce a bug that causes your query not to be skipped, even though id is still undefined - and TypeScript won't be able to warn you about it.
So instead, we recommend using skipToken, as that will work without a lie to the compiler or an obscure default value:
const { data } = useSuspenseQuery(query,id ? { variables: { id } } : skipToken);
In this case, it becomes apparent for TypeScript that there is a direct connection between skipping and the variables option - and it will work without unsafe workarounds.