There are two ways to handle multiple queries with React Query.
The simplest method is just to call useQuery twice but re-assign the data variable that we’re destructuring. They can’t both be called data.
const { data: userData } = useQuery("users", fetchUsers);
const { data: postData } = useQuery("posts", fetchPosts);
There is also useQueries which is perfect for this situation. It returns an array of queries. We can get access to each one using array destructuring.
const [posts, users] = useQueries([
{ queryKey: ["posts"], queryFn: fetchPosts },
{ queryKey: ["users"], queryFn: fetchUsers },
]);
The queries that are returned from useQueries also contains the usual suspects like isLoading isError etc.
const [posts, users] = useQueries([
{ queryKey: ["posts"], queryFn: fetchPosts },
{ queryKey: ["users"], queryFn: fetchUsers },
]);
const { data, isLoading } = posts;
There are also situations where you may want to wait for everything to finish before rendering any data. In that case, we can check if any / some of the queries are still in their loading state (isLoading comes from the useQuery hook).
const results = useQueries([
{ queryKey: ["posts"], queryFn: fetchPosts },
{ queryKey: ["users"], queryFn: fetchUsers },
]);
const isLoading = results.some((query) => query.isLoading);
return { isLoading, results };
Within our component, we only need to pull in 1 isLoading value and handle that case until ALL of the results are ready.