Pular para o conteúdo
Beta

Novo layout em fase de testes.

Versão beta

Nova versão do layout do Doug Design

Estamos validando uma nova versão visual do site, com navegação reformulada, leitura mais confortável e foco em desempenho, principalmente em celulares.

O que não muda
Conteúdo editorial, endereços (URLs) das publicações, a Política de Privacidade e as suas preferências de cookies.
O que pode mudar
Por ser uma versão beta, ajustes de visual, acessibilidade e desempenho serão aplicados de forma contínua, com base em medições e no retorno dos leitores.

Encontrou erro de exibição, texto difícil de ler ou lentidão? Conte pela página de contato, informando o endereço da página, o aparelho e o navegador usados.

Programação•6 min de leitura

React 19: Como Usar as Novas Actions e o hook useActionState

Descubra como o React 19 simplifica o gerenciamento de estados assíncronos e submissões de formulários com Actions e novos hooks nativos.

Lila Dev

React atomic icon illustration
Neste artigo
  1. O que são Actions no React 19?
  2. O Novo Hook useActionState
  3. Exemplo Prático: Atualizando Perfil
  4. Benefícios da Nova Abordagem
  5. Conclusão e Próximos Passos

O React 19 trouxe um salto qualitativo na forma como lidamos com interações assíncronas e formulários. A grande mudança gira em torno do conceito de Actions, que simplificam o gerenciamento de estados de carregamento, erros e feedback visual diretamente nas funções de submissão de dados.

Neste guia prático, vamos analisar como as antigas práticas de gerenciamento de formulários mudaram e como implementar a nova API de formulários usando o hook useActionState (anteriormente conhecido como useFormState nas versões de teste).

O que são Actions no React 19?

Tradicionalmente, ao submeter um formulário ou disparar uma chamada de API assíncrona após um clique, você precisava gerenciar manualmente o estado de carregamento (pending), o estado de sucesso e possíveis erros de forma explícita na sua árvore de estados.

// O jeito antigo (React 18)
const [isPending, setIsPending] = useState(false);
const [error, setError] = useState(null);

async function handleSubmit() {
  setIsPending(true);
  try {
    await updateProfileName(name);
  } catch (err) {
    setError(err);
  } finally {
    setIsPending(false);
  }
}

Com o React 19, se uma função passada a um elemento de formulário for assíncrona, o React gerencia automaticamente o ciclo de transição e o estado pendente. Isso é o que chamamos de Action.

O Novo Hook useActionState

O useActionState simplifica ainda mais esse processo. Ele aceita uma função action e retorna o estado atualizado do formulário, a nova action para passar no atributo action do formulário, e um booleano que indica se a ação está pendente.

Exemplo Prático: Atualizando Perfil

Abaixo, veja como implementar um formulário moderno usando useActionState:

import { useActionState } from 'react';

// Função assíncrona que simula o salvamento
async function updateProfile(prevState: any, formData: FormData) {
  const name = formData.get("username") as string;
  try {
    const response = await fetch('/api/profile', {
      method: 'POST',
      body: JSON.stringify({ name }),
    });
    if (!response.ok) throw new Error("Erro ao salvar dados");
    return { success: true, message: "Perfil atualizado!" };
  } catch (err: any) {
    return { success: false, message: err.message };
  }
}

export function ProfileForm() {
  const [state, formAction, isPending] = useActionState(updateProfile, {
    success: null,
    message: ""
  });

  return (
    <form action={formAction} className="flex flex-col gap-4 max-w-sm">
      <label htmlFor="username" className="text-sm font-medium">Nome do Usuário</label>
      <input 
        id="username"
        name="username"
        type="text" 
        required 
        disabled={isPending}
        className="border p-2 rounded"
      />
      
      <button 
        type="submit" 
        disabled={isPending}
        className="bg-blue-600 text-white p-2 rounded hover:bg-blue-700 disabled:bg-gray-400"
      >
        {isPending ? 'Salvando...' : 'Salvar Alterações'}
      </button>

      {state.message && (
        <p className={state.success ? "text-green-600" : "text-red-600"}>
          {state.message}
        </p>
      )}
    </form>
  );
}

Benefícios da Nova Abordagem

  1. Adeus ao Boilerplate: Não há necessidade de criar múltiplos useState para controlar erros e carregamentos.
  2. Suporte Nativo a FormData: O React 19 integra-se nativamente com a API FormData do navegador, eliminando o mapeamento manual de campos.
  3. Melhoria no Progressive Enhancement: Formulários funcionam de maneira robusta mesmo antes do JavaScript da aplicação terminar de carregar completamente.

Conclusão e Próximos Passos

Se você está começando um novo projeto ou atualizando um existente, adotar as Actions e o useActionState é o melhor caminho para manter o código limpo, testável e de alta performance. Certifique-se de testar seus fluxos de tratamento de erros, pois o React 19 agora relata automaticamente erros não tratados nas transições de estado de forma muito mais inteligente.

CompartilheWhatsAppXFacebook
Publicidade

Newsletter

Acompanhe sem perder nada

A newsletter está em preparação. Enquanto a integração de inscrição não fica pronta, assine o feed RSS e receba cada nova publicação no seu leitor favorito.

Assinar o RSS

Comentários

Os comentários usam o Giscus e são carregados só quando você pedir.

Continue lendo

Mais em Programação