React Query is often described as the missing data-fetching library for React, but in more technical terms, it makes fetching, caching, synchronizing and updating server state in your React applications a breeze.jotai-tanstack-query is a Jotai extension library for TanStack Query. It provides a wonderful interface with all of the TanStack Query features, providing you the ability to use those features in combination with your existing Jotai state.
Support
jotai-tanstack-query currently supports TanStack Query v5.Install
In addition tojotai, you have to install jotai-tanstack-query and @tanstack/query-core to use the extension.
Incremental Adoption
You can incrementally adoptjotai-tanstack-query in your app. It’s not an all or nothing solution. You just have to ensure you are using the same QueryClient instance. QueryClient Setup.
Exported functions
atomWithQueryfor useQueryatomWithInfiniteQueryfor useInfiniteQueryatomWithMutationfor useMutationatomWithSuspenseQueryfor useSuspenseQueryatomWithSuspenseInfiniteQueryfor useSuspenseInfiniteQueryatomWithMutationStatefor useMutationState
getOptions parameter is a function that returns an input to the observer.
The second optional getQueryClient parameter is a function that return QueryClient.
atomWithQuery usage
atomWithQuery creates a new atom that implements a standard Query from TanStack Query.
atomWithInfiniteQuery usage
atomWithInfiniteQuery is very similar to atomWithQuery, however it is for an InfiniteQuery, which is used for data that is meant to be paginated. You can read more about Infinite Queries here.
Rendering lists that can additively “load more” data onto an existing set of data or “infinite scroll” is also a very common UI pattern. React Query supports a useful version of useQuery called useInfiniteQuery for querying these types of lists.A notable difference between a standard query atom is the additional option
getNextPageParam and getPreviousPageParam, which is what you’ll use to instruct the query on how to fetch any additional pages.
atomWithMutation usage
atomWithMutation creates a new atom that implements a standard Mutation from TanStack Query.
Unlike queries, mutations are typically used to create/update/delete data or perform server side-effects.
atomWithMutationState usage
atomWithMutationState creates a new atom that gives you access to all mutations in the MutationCache.
Suspense
jotai-tanstack-query can also be used with React’s Suspense.atomWithSuspenseQuery usage
atomWithSuspenseInfiniteQuery usage
Referencing the same instance of Query Client in your project
Perhaps you have some custom hooks in your project that utilises theuseQueryClient() hook to obtain the QueryClient object and call its methods.
To ensure that you reference the same QueryClient object, be sure to wrap the root of your project in a <Provider> and initialise queryClientAtom with the same queryClient value you provided to QueryClientProvider.
Without this step, useQueryAtom will reference a separate QueryClient from any hooks that utilise the useQueryClient() hook to get the queryClient.
Alternatively, you can specify your queryClient with getQueryClient parameter.
Example
In the example below, we have a mutation hook,useTodoMutation and a query todosAtom.
We included an initialisation step in our root <App> node.
Although they reference methods same query key ('todos'), the onSuccess invalidation in useTodoMutation will not trigger if the Provider initialisation step was not done.
This will result in todosAtom showing stale data as it was not prompted to refetch.
SSR support
All atoms can be used within the context of a server side rendered app, such as a next.js app or Gatsby app. You can use both options that React Query supports for use within SSR apps, hydration orinitialData.
Error handling
Fetch error will be thrown and can be caught with ErrorBoundary. Refetching may recover from a temporary error. See a working example to learn more.Devtools
In order to use the Devtools, you need to install it additionally.<ReactQueryDevtools /> within <QueryClientProvider />.