React Example: Default Query Function
Source URL: https://tanstack.com/query/latest/docs/framework/react/examples/default-query-function
Search…
K
Auto
Docs
Partners
React
Latest
Search…
K
latest
React
Latest
React Example: Default Query Function
Section titled “React Example: Default Query Function”Code ExplorerCode
Interactive SandboxSandbox
-
public
-
src
index.tsx
-
.eslintrc
-
.gitignore
-
README.md
-
index.html
-
package.json
-
tsconfig.json
-
vite.config.ts
tsx
import React from 'react' import ReactDOM from 'react-dom/client' import { QueryClient, QueryClientProvider, useQuery, useQueryClient, } from '@tanstack/react-query' import { ReactQueryDevtools } from '@tanstack/react-query-devtools' import type { QueryKey } from '@tanstack/react-query'
type Post = { id: number title: string body: string }
// Define a default query function that will receive the query key const defaultQueryFn = async ({ queryKey }: { queryKey: QueryKey }) => { const response = await fetch( `https://jsonplaceholder.typicode.com${queryKey[0]}`, ) return await response.json() }
// provide the default query function to your app via the query client const queryClient = new QueryClient({ defaultOptions: { queries: { queryFn: defaultQueryFn, }, }, })
function App() { const [postId, setPostId] = React.useState(-1)
return ( <p> As you visit the posts below, you will notice them in a loading state the first time you load them. However, after you return to this list and click on any posts you have already visited again, you will see them load instantly and background refresh right before your eyes!{' '} <strong> (You may need to throttle your network speed to simulate longer loading sequences) </strong> </p> {postId > -1 ? ( ) : ( )} ) }
function Posts({ setPostId, }: { setPostId: React.Dispatch<React.SetStateAction<number>> }) { const queryClient = useQueryClient()
// All you have to do now is pass a key! const { status, data, error, isFetching } = useQuery<Array<Post>>({ queryKey: ['/posts'], })
return ( <h1>Posts</h1> {status === 'pending' ? ( 'Loading...' ) : status === 'error' ? ( <span>Error: {error.message}</span> ) : ( <> {data.map((post) => ( <p key={post.id}> <a onClick={() => setPostId(post.id)} href="#" style={ // We can use the queryCache here to show bold links for // ones that are cached queryClient.getQueryData([`/posts/${post.id}`]) ? { fontWeight: 'bold', color: 'green', } : {} } > {post.title} </a> </p> ))} <div>{isFetching ? 'Background Updating...' : ' '}</div> </> )} ) }
function Post({ postId, setPostId, }: { postId: number setPostId: React.Dispatch<React.SetStateAction<number>> }) { // You can even leave out the queryFn and just go straight into options const { status, data, error, isFetching } = useQuery<Post>({ queryKey: [`/posts/${postId}`], enabled: !!postId, })
return ( <a onClick={() => setPostId(-1)} href="#"> Back </a> {!postId || status === 'pending' ? ( 'Loading...' ) : status === 'error' ? ( <span>Error: {error.message}</span> ) : ( <> <h1>{data.title}</h1> <p>{data.body}</p> <div>{isFetching ? 'Background Updating...' : ' '}</div> </> )} ) }
const rootElement = document.getElementById('root') as HTMLElement ReactDOM.createRoot(rootElement).render(<App />)[Want to Skip the Docs?
Section titled “[Want to Skip the Docs?”“If you’re serious about really understanding React Query, there’s no better way than with query.gg”—Tanner Linsley
Learn More](https://query.gg?s=tanstack)
