useMutation useMutation: Operações de Escrita

Última atualização: 2026-11-03

useMutation useMutation: Operações de Escrita

useMutation gerencia o estado assíncrono de operações de escrita (POST, PUT, DELETE): mutate dispara a requisição, isPending e isError reportam o progresso, e onSuccess invalida as queries relacionadas para que a lista se atualize sozinha. Ele não faz cache de dados, apenas gerencia esse único envio. Essa divisão de trabalho é o que torna query e mutation um par natural. Você também pode passar callbacks por chamada, então uma única instância de hook pode servir vários formulários diferentes sem compartilhar seus estados.

GrupoDados e Engenharia
TipoHook
DesdeTanStack Query v5

ℹ️ Informação O editor transpila JSX para JavaScript e renderiza a UI real na sandbox; os componentes são montados automaticamente — sem render manual.

📝 Sintaxe

import { useMutation, useQueryClient } from '@tanstack/react-query'

const qc = useQueryClient()
const mutation = useMutation({
  mutationFn: newTodo => fetch('/api/todos', {
    method: 'POST',
    body: JSON.stringify(newTodo)
  }).then(r => r.json()),
  onSuccess: () => {
    qc.invalidateQueries({ queryKey: ['todos'] })  // the list turns stale -> it refetches itself
  }
})

mutation.mutate({ title: 'New task' })   // fire the submission

⚙️ Parâmetros

mutationFnObrigatório. A função assíncrona que executa a operação de escrita; as variáveis passadas a mutate(variáveis) chegam como seu argumento.
onSuccess / onErrorHooks de callback: invalidam queries após sucesso, mostram mensagem após falha; também podem ser sobrescritos por chamada com mutate(v, { onSuccess }).

Retorna:Retorna { mutate, isPending, isError, data, error }: mutate(variáveis) dispara a requisição (não retorna Promise), enquanto mutateAsync sim retorna uma Promise.

▶ Exemplo

O exemplo roda direto: renderiza automaticamente ao expandir e edições valem na hora.

Saída:

O botão de envio vira "Salvando…" e permanece desabilitado por um segundo, então a lista ganha um item e uma mensagem de sucesso aparece — o fluxo completo de mutate, isPending e onSuccess (demonstração simulada).

💡 Pontos-chave

⚠️ Aviso mutate não retorna Promise (o resultado chega pelos callbacks); quando precisar aguardar dentro de uma função async, use mutateAsync e trate os erros você mesmo.
💡 Dica Após uma escrita bem-sucedida, chame invalidateQueries em vez de ajustar a lista manualmente — deixe a camada de cache refazer a busca para que servidor e cliente fiquem sincronizados.
ℹ️ Informação Atualizações otimistas (onMutate muda o cache primeiro, uma falha o reverte) também cabem na cadeia de callbacks do useMutation, o que faz o envio parecer instantâneo.
Mais casos em breve.

📚 Tutoriais Relacionados

❓ Perguntas Frequentes

P Qual a diferença central entre useMutation e useQuery?
R Uma query lê dados, vem com cache e pode refazer a busca em segundo plano; uma mutation escreve dados, não é cacheada e é disparada explicitamente por uma ação do usuário. Leia com query, escreva com mutation.
P Como a lista se atualiza sozinha após um envio?
R Chame queryClient.invalidateQueries({ queryKey: ['todos'] }) em onSuccess: a query da lista é marcada como obsoleta e useQuery refaz a busca dos dados mais recentes.
P Como evito envios duplicados?
R Desabilite o botão enquanto isPending for verdadeiro (como no exemplo) ou verifique o status antes de enviar; o servidor ainda precisa de idempotência como rede de segurança.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%