Skip to content

Commit 158b4fb

Browse files
committed
docs(examples): Simplify atom usage for atomWithQueries
1 parent e7cf0a1 commit 158b4fb

File tree

2 files changed

+56
-56
lines changed

2 files changed

+56
-56
lines changed

README.md

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -198,15 +198,15 @@ There are two ways to use `atomWithQueries`:
198198
#### Basic usage - Returns an array of query atoms
199199

200200
```jsx
201-
import { atom, useAtom } from 'jotai'
202-
import { atomWithQueries } from 'jotai-tanstack-query'
201+
import { Atom, atom, useAtom } from 'jotai'
202+
import { type AtomWithQueryResult, atomWithQueries } from 'jotai-tanstack-query'
203203

204204
const userIdsAtom = atom([1, 2, 3])
205205

206-
const UsersData = () => {
207-
const [userIds] = useAtom(userIdsAtom)
208-
209-
const userQueryAtoms = atomWithQueries({
206+
// Independent atom - encapsulates query logic
207+
const userQueryAtomsAtom = atom((get) => {
208+
const userIds = get(userIdsAtom)
209+
return atomWithQueries({
210210
queries: userIds.map((id) => () => ({
211211
queryKey: ['user', id],
212212
queryFn: async ({ queryKey: [, userId] }) => {
@@ -217,42 +217,48 @@ const UsersData = () => {
217217
},
218218
})),
219219
})
220+
})
220221

221-
return (
222-
<div>
223-
{userQueryAtoms.map((queryAtom, index) => (
224-
<UserData key={index} queryAtom={queryAtom} />
225-
))}
226-
</div>
227-
)
228-
}
229-
230-
const UserData = ({ queryAtom }) => {
222+
// Independent UI component
223+
const UserData = ({ queryAtom }: { queryAtom: Atom<AtomWithQueryResult> }) => {
231224
const [{ data, isPending, isError }] = useAtom(queryAtom)
232225

233226
if (isPending) return <div>Loading...</div>
234227
if (isError) return <div>Error</div>
228+
if (!data) return null
235229

236230
return (
237231
<div>
238232
{data.name} - {data.email}
239233
</div>
240234
)
241235
}
236+
237+
// Component only needs one useAtom call
238+
const UsersData = () => {
239+
const [userQueryAtoms] = useAtom(userQueryAtomsAtom)
240+
return (
241+
<div>
242+
{userQueryAtoms.map((queryAtom, index) => (
243+
<UserData key={index} queryAtom={queryAtom} />
244+
))}
245+
</div>
246+
)
247+
}
242248
```
243249

244250
#### Advanced usage - Combine multiple query results
245251

246252
```jsx
247-
import { atom, useAtom } from 'jotai'
253+
import { Atom, atom, useAtom } from 'jotai'
248254
import { atomWithQueries } from 'jotai-tanstack-query'
249255

250256
const userIdsAtom = atom([1, 2, 3])
251257

252-
const CombinedUsersData = () => {
253-
const [userIds] = useAtom(userIdsAtom)
254-
255-
const combinedUsersDataAtom = atomWithQueries({
258+
// Independent atom - encapsulates combined query logic
259+
const combinedUsersDataAtom = atom((get) => {
260+
const userIds = get(userIdsAtom)
261+
return atomWithQueries({
256262
queries: userIds.map((id) => () => ({
257263
queryKey: ['user', id],
258264
queryFn: async ({ queryKey: [, userId] }) => {
@@ -268,8 +274,12 @@ const CombinedUsersData = () => {
268274
isError: results.some((result) => result.isError),
269275
}),
270276
})
277+
})
271278

272-
const [{ data, isPending, isError }] = useAtom(combinedUsersDataAtom)
279+
// Component only needs one useAtom call
280+
const CombinedUsersData = () => {
281+
const [combinedUsersDataAtomValue] = useAtom(combinedUsersDataAtom)
282+
const [{ data, isPending, isError }] = useAtom(combinedUsersDataAtomValue)
273283

274284
if (isPending) return <div>Loading...</div>
275285
if (isError) return <div>Error</div>

examples/07_queries/src/App.tsx

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ interface User {
1010
email: string
1111
}
1212

13-
const UsersData = () => {
14-
const [userIds] = useAtom(userIdsAtom)
15-
16-
const userQueryAtoms = atomWithQueries<User>({
13+
const userQueryAtomsAtom = atom((get) => {
14+
const userIds = get(userIdsAtom)
15+
return atomWithQueries<User>({
1716
queries: userIds.map((id) => () => ({
1817
queryKey: ['user', id],
1918
queryFn: async ({ queryKey: [, userId] }) => {
@@ -24,6 +23,10 @@ const UsersData = () => {
2423
},
2524
})),
2625
})
26+
})
27+
28+
const UsersData = () => {
29+
const [userQueryAtoms] = useAtom(userQueryAtomsAtom)
2730
return (
2831
<div>
2932
<h3>Users: </h3>
@@ -36,10 +39,9 @@ const UsersData = () => {
3639
)
3740
}
3841

39-
const CombinedUsersData = () => {
40-
const [userIds] = useAtom(userIdsAtom)
41-
42-
const combinedUsersDataAtom = atomWithQueries<{
42+
const combinedUsersDataAtom = atom((get) => {
43+
const userIds = get(userIdsAtom)
44+
return atomWithQueries<{
4345
data: User[]
4446
isPending: boolean
4547
isError: boolean
@@ -61,36 +63,24 @@ const CombinedUsersData = () => {
6163
}
6264
},
6365
})
66+
})
6467

65-
return (
66-
<div>
67-
<h3>Users: (combinedQueries)</h3>
68-
<div>
69-
<CombinedData queryAtom={combinedUsersDataAtom} />
70-
</div>
71-
</div>
72-
)
73-
}
74-
75-
const CombinedData = ({
76-
queryAtom,
77-
}: {
78-
queryAtom: Atom<{
79-
data: User[]
80-
isPending: boolean
81-
isError: boolean
82-
}>
83-
}) => {
84-
const [{ data, isPending, isError }] = useAtom(queryAtom)
85-
86-
if (isPending) return <div>Loading...</div>
87-
if (isError) return <div>Error</div>
68+
const CombinedUsersData = () => {
69+
const [combinedUsersDataAtomValue] = useAtom(combinedUsersDataAtom)
70+
const [{ data, isPending, isError }] = useAtom(combinedUsersDataAtomValue)
8871

8972
return (
9073
<div>
91-
{data.map((user) => (
92-
<UserDisplay key={user.id} user={user} />
93-
))}
74+
<h3>Users: (combinedQueries)</h3>
75+
{isPending && <div>Loading...</div>}
76+
{isError && <div>Error</div>}
77+
{!isPending && !isError && (
78+
<div>
79+
{data.map((user) => (
80+
<UserDisplay key={user.id} user={user} />
81+
))}
82+
</div>
83+
)}
9484
</div>
9585
)
9686
}

0 commit comments

Comments
 (0)