0Pricing
React Academy · Aula

Mutações com useMutation

Envie dados para APIs com useMutation, trate estados de carregamento e erro e invalide consultas após o sucesso.

Mutações com useMutation é uma aula grátis de React Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.

Boas-vindas

Nesta lição, você usará useMutation para enviar dados a APIs, tratar estados de carregamento e erro e invalidar consultas obsoletas após alterações bem-sucedidas.

Noções básicas de useMutation

Chame useMutation com uma mutationFn. Ela retorna uma função mutate e propriedades de status. Chame mutate() para iniciar a operação.
import { useMutation } from '@tanstack/react-query';

const { mutate, isLoading, isError } = useMutation({
  mutationFn: (newPost) => fetch('/api/posts', {
    method: 'POST',
    body: JSON.stringify(newPost),
  }).then(r => r.json()),
});

Chamando mutate

Chame `mutate(variables)` a partir de um manipulador de eventos. As variáveis são passadas a mutationFn como o primeiro argumento.
<button onClick={() => mutate({ title: 'New Post' })}>
  Create Post
</button>

Retornos de chamada: onSuccess, onError, onSettled

Adicione opções de retorno de chamada a useMutation: onSuccess é executado após uma alteração bem-sucedida, onError é executado em caso de falha e onSettled é executado nos dois casos (como finally).
useMutation({
  mutationFn: createPost,
  onSuccess: (data) => {
    console.log('Created:', data);
    navigate('/posts/' + data.id);
  },
  onError: (error) => {
    toast.error(error.message);
  },
})

Invalidando consultas após uma alteração

Após uma alteração bem-sucedida, invalide as consultas relacionadas para que o React Query busque dados atualizados. Use queryClient.invalidateQueries em onSuccess.
import { useQueryClient } from '@tanstack/react-query';

const queryClient = useQueryClient();

const { mutate } = useMutation({
  mutationFn: createPost,
  onSuccess: () => {
    queryClient.invalidateQueries({ queryKey: ['posts'] });
  },
});

mutateAsync para sintaxe com await

Use `mutateAsync` em vez de `mutate` para aguardar a alteração e tratá-la com try/catch.
const { mutateAsync } = useMutation({ mutationFn: createPost });

async function handleSubmit() {
  try {
    const post = await mutateAsync({ title: 'Draft' });
    navigate('/posts/' + post.id);
  } catch (err) {
    setError(err.message);
  }
}

Desativando o envio durante uma alteração

Use `isPending` (ou `isLoading`) para desativar o botão de envio enquanto a alteração estiver em andamento.
const { mutate, isPending } = useMutation({ mutationFn: saveItem });

<button onClick={() => mutate(item)} disabled={isPending}>
  {isPending ? 'Saving...' : 'Save'}
</button>

Atualizações otimistas com onMutate

Use onMutate para atualizar o cache de forma otimista antes que o servidor responda. Faça a reversão em onError usando o contexto retornado por onMutate.
useMutation({
  mutationFn: likePost,
  onMutate: async (id) => {
    await queryClient.cancelQueries({ queryKey: ['posts'] });
    const prev = queryClient.getQueryData(['posts']);
    queryClient.setQueryData(['posts'], old => old.map(p =>
      p.id === id ? { ...p, likes: p.likes + 1 } : p));
    return { prev };
  },
  onError: (err, id, ctx) => queryClient.setQueryData(['posts'], ctx.prev),
  onSettled: () => queryClient.invalidateQueries({ queryKey: ['posts'] }),
})

Redefinição do estado da alteração

Chame `reset()` de useMutation para limpar o estado da alteração (dados, erro e status). Isso é útil após sair da página ou limpar um formulário.
const { mutate, isError, reset } = useMutation({ /* ... */ });

{isError && (
  <>
    <p>Error!</p>
    <button onClick={reset}>Try Again</button>
  </>
)}

Várias alterações em paralelo

Chame mutate várias vezes em paralelo — cada chamada é acompanhada de forma independente. Use mutateAsync com Promise.all para alterações paralelas.
await Promise.all([
  mutateAsync({ id: 1, title: 'First' }),
  mutateAsync({ id: 2, title: 'Second' }),
]);

Verificação rápida

Após uma alteração bem-sucedida, qual é a maneira recomendada de garantir que a interface mostre dados atualizados?

Recapitulação

useMutation expõe mutate, isPending e retornos de chamada do ciclo de vida. Use onSuccess para invalidar consultas relacionadas. Use mutateAsync em fluxos baseados em await. Use onMutate/onError para atualizações otimistas com reversão.

A seguir

Próxima lição: **Rolagem infinita e paginação com useInfiniteQuery** — você buscará dados paginados e carregará mais páginas sem interrupções.

Perguntas Frequentes

A aula “Mutações com useMutation” é grátis?

Sim — o texto completo de “Mutações com useMutation” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.

O que vou aprender em “Mutações com useMutation”?

Envie dados para APIs com useMutation, trate estados de carregamento e erro e invalide consultas após o sucesso. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar React Academy?

Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Mutações com useMutation”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de React Academy?

Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Configurando o React Query e o QueryClient
  2. Armazenamento em cache, tempo de obsolescência e nova busca em segundo plano
  3. Mutações com useMutation
  4. Rolagem infinita e paginação com useInfiniteQuery
← Voltar para React Academy