React6 min read
React Query
Fetch, cache, and sync server data with React Query.
Sarah Johnson
December 20, 2025
0.0k0
React Query simplifies data fetching and caching.
Install
npm install @tanstack/react-query
Setup
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
const queryClient = new QueryClient();
function App() {
return (
<QueryClientProvider client={queryClient}>
<Users />
</QueryClientProvider>
);
}
Fetching Data
import { useQuery } from '@tanstack/react-query';
function Users() {
const { data, isLoading, error } = useQuery({
queryKey: ['users'],
queryFn: () => fetch('/api/users').then(res => res.json())
});
if (isLoading) return <p>Loading...</p>;
if (error) return <p>Error: {error.message}</p>;
return (
<div>
{data.map(user => <p key={user.id}>{user.name}</p>)}
</div>
);
}
Mutations
import { useMutation, useQueryClient } from '@tanstack/react-query';
function CreateUser() {
const queryClient = useQueryClient();
const mutation = useMutation({
mutationFn: (newUser) => fetch('/api/users', {
method: 'POST',
body: JSON.stringify(newUser)
}),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['users'] });
}
});
return (
<button onClick={() => mutation.mutate({ name: 'John' })}>
Add User
</button>
);
}
Remember
- Automatic caching
- Background refetching
- Optimistic updates
- Better than useState + useEffect
Next: Learn state management with Zustand!
#React#React Query#Data Fetching#Intermediate