Skip to content

Commit 0fb9bb8

Browse files
authored
feat: add useLoadableQuery example (#124)
1 parent 0564c57 commit 0fb9bb8

File tree

6 files changed

+156
-25
lines changed

6 files changed

+156
-25
lines changed

apollo-client/v3/suspense-hooks/package-lock.json

+58-17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apollo-client/v3/suspense-hooks/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"version": "0.1.0",
44
"private": true,
55
"dependencies": {
6-
"@apollo/client": "3.8.0",
6+
"@apollo/client": "^3.9.0-rc.1",
77
"@testing-library/jest-dom": "5.17.0",
88
"@testing-library/react": "14.0.0",
99
"@testing-library/user-event": "14.4.3",

apollo-client/v3/suspense-hooks/src/routes.tsx

+7-6
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
import UseSuspenseQuery from "./useSuspenseQuery";
33
import UseSuspenseQueryChangingVariables from "./useSuspenseQuery-changing-variables";
44
import UseSuspenseQueryPartialData from "./useSuspenseQuery-partialData";
5-
import UseSuspenseQueryErrorHandling from "./useSuspsenseQuery-error-handling";
65
import UseBackgroundQuery from "./useBackgroundQuery";
76
import Refetch from "./refetch-fetchMore";
7+
import useLoadableQuery from "./useLoadableQuery";
88

99
export const routes = [
1010
{
@@ -22,11 +22,6 @@ export const routes = [
2222
title: "<code>useSuspenseQuery</code>: rendering partial data",
2323
Element: UseSuspenseQueryPartialData,
2424
},
25-
{
26-
path: "useSuspenseQuery-error-handling",
27-
title: "<code>useSuspenseQuery</code>: error handling",
28-
Element: UseSuspenseQueryErrorHandling,
29-
},
3025
{
3126
path: "useBackgroundQuery-useReadQuery",
3227
title:
@@ -39,4 +34,10 @@ export const routes = [
3934
"Refetching with <code>useSuspenseQuery</code> and <code>useBackgroundQuery</code>",
4035
Element: Refetch,
4136
},
37+
{
38+
path: "useLoadableQuery",
39+
title:
40+
"Fetching data on user interaction with <code>useLoadableQuery</code>",
41+
Element: useLoadableQuery,
42+
},
4243
];

apollo-client/v3/suspense-hooks/src/useBackgroundQuery.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ interface Variables {
2727
interface DogProps {
2828
id: string;
2929
queryRef: QueryReference<BreedData>;
30-
// dogQueryRef: QueryReference<DogData>;
3130
}
3231

3332
interface BreedsProps {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import { Suspense } from "react";
2+
import {
3+
gql,
4+
QueryReference,
5+
TypedDocumentNode,
6+
useLoadableQuery,
7+
useReadQuery,
8+
useSuspenseQuery,
9+
} from "@apollo/client";
10+
11+
interface DogsData {
12+
dogs: {
13+
id: string;
14+
name: string;
15+
}[];
16+
}
17+
18+
interface DogData {
19+
dog: {
20+
id: string;
21+
name: string;
22+
breed: string;
23+
};
24+
}
25+
26+
interface Variables {
27+
id: string;
28+
}
29+
30+
export const GET_DOG_QUERY: TypedDocumentNode<DogData, Variables> = gql`
31+
query GetDog($id: String) {
32+
dog(id: $id) {
33+
# By default, an object's cache key is a combination of its
34+
# __typename and id fields, so we should always make sure the
35+
# id is in the response so our data can be normalized and cached properly.
36+
id
37+
name
38+
breed
39+
}
40+
}
41+
`;
42+
43+
export const GET_DOGS_QUERY: TypedDocumentNode<DogsData, Variables> = gql`
44+
query GetDogs {
45+
dogs {
46+
id
47+
name
48+
breed
49+
}
50+
}
51+
`;
52+
53+
function App() {
54+
const { data } = useSuspenseQuery(GET_DOGS_QUERY);
55+
const [loadDog, queryRef] = useLoadableQuery(GET_DOG_QUERY);
56+
57+
return (
58+
<>
59+
<select onChange={(e) => loadDog({ id: e.target.value })}>
60+
{data.dogs.map(({ id, name }) => (
61+
<option key={id} value={id}>
62+
{name}
63+
</option>
64+
))}
65+
</select>
66+
<Suspense fallback={<div>Loading...</div>}>
67+
{queryRef && <Dog queryRef={queryRef} />}
68+
</Suspense>
69+
</>
70+
);
71+
}
72+
73+
interface DogProps {
74+
queryRef: QueryReference<DogData>;
75+
}
76+
77+
function Dog({ queryRef }: DogProps) {
78+
const { data } = useReadQuery(queryRef);
79+
80+
return (
81+
<>
82+
<div>Name: {data.dog.name}</div>
83+
<div>Breed: {data.dog.breed}</div>
84+
</>
85+
);
86+
}
87+
88+
export default App;

apollo-client/v3/suspense-hooks/src/useSuspenseQuery-changing-variables.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export const GET_DOG_QUERY: TypedDocumentNode<DogData, Variables> = gql`
3232
# id is in the response so our data can be normalized and cached properly.
3333
id
3434
name
35+
breed
3536
}
3637
}
3738
`;
@@ -41,6 +42,7 @@ export const GET_DOGS_QUERY: TypedDocumentNode<DogsData, Variables> = gql`
4142
dogs {
4243
id
4344
name
45+
breed
4446
}
4547
}
4648
`;

0 commit comments

Comments
 (0)