@@ -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
204204const 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'
248254import { atomWithQueries } from ' jotai-tanstack-query'
249255
250256const 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>
0 commit comments