Basic Mutations in React
From the TanStack Query cheat sheet · Mutations · verified Jul 2026
Basic Mutations
Using useMutation for data modifications
typescript
import { useMutation, useQueryClient } from '@tanstack/react-query'
function CreatePost() {
const queryClient = useQueryClient()
const mutation = useMutation({
mutationFn: createPost,
onSuccess: () => {
// Invalidate and refetch
queryClient.invalidateQueries({ queryKey: ['posts'] })
},
})
return (
<form
onSubmit={(e) => {
e.preventDefault()
const formData = new FormData(e.target)
mutation.mutate({
title: formData.get('title'),
content: formData.get('content')
})
}}
>
<input name="title" />
<textarea name="content" />
<button type="submit">
{mutation.isPending ? 'Creating...' : 'Create Post'}
</button>
{mutation.isError && (
<div>Error: {mutation.error.message}</div>
)}
</form>
)
}💡 onMutate enables optimistic updates for instant UI feedback
⚡ mutateAsync returns a promise for async/await usage
📌 Always invalidate related queries after mutations
🟢 Use mutate for fire-and-forget, mutateAsync when you need the result
mutationscreateoptimistic