Au 14 - Front-end - React - Processando os dados do formulário - Mestres BEGIN
Objetivo Principal
Criar um fluxo completo de cadastro com:
- Controle de abertura/fechamento do modal
- Captura eficiente dos dados do formulário
- Integração com API backend
- Atualização automática da lista após cadastro
Arquitetura do Componente
ProductSubHeader (Dispara abertura)
ProductsPage (Controla estado do modal)
AddProductModal
AddProductForm (Envia dados)
Controle do Modal
Gerenciamento de estado com React Hooks:
1// ProductsPage.tsx
2const [showModal, setShowModal] = useState(false);
3const handleOpenModal = () => setShowModal(true);
4{showModal && (
5 <div>
6 <div className="modal-content">
7 <button onClick={() => setShowModal(false)}>X</button>
8 <AddProductForm onSuccess={() => { setShowModal(false); refreshProducts(); }} />
9 </div>
10 </div>
11)}
Manipulação do Formulário com FormData
Solução eficiente para captura de dados:
1const handleSubmit = async (e: React.FormEvent) => {
2 e.preventDefault();
3 // 1. Coleta os dados do formulário
4 const formData = new FormData(e.currentTarget as HTMLFormElement);
5 // 2. Converte para objeto JavaScript
6 const productData = Object.fromEntries(formData.entries());
7 // 3. Ajuste de tipos (todos os valores vem como string)
8 const payload = { ...productData, price: Number(productData.price), quantity: Number(productData.quantity) };
9 console.log("Dados enviados:", payload);
10};
Vantagens do FormData:
- Elimina a necessidade de múltiplos estados
- Reduz código boilerplate
- Mantém a referência nativa dos inputs
Integração com Backend
Fluxo completo de envio dos dados:
1try {
2 // 1. Envio para API
3 const response = await api.post("/products", payload);
4 // 2. Notificação de sucesso
5 toast.success("Produto cadastrado!");
6 // 3. Execução do callback onSuccess();
7 onSuccess();
8 // 4. Reset do formulário (e.target as HTMLFormElement).reset();
9} catch (error) {
10 console.error("Falha no cadastro:", error);
11 toast.error("Erro ao cadastrar produto");
12}
Estrutura do Formulário
Exemplo de campos com atributos name
:
Desafios e Soluções
Desafio | Solução Implementada |
---|---|
Campos não capturados | Adicionar atributo name em todos os inputs |
Inconsistência com API | Alinhar name com as chaves do backend |
Valores como string | Conversão explícita de tipos (number, boolean) |
Fluxo de Atualização Automática
- Sucesso no
POST /products
- Fecha o modal (
setShowModal(false)
) - Callback
onProductCreation()
ProductsPage
refazGET /products
- Estado da lista atualizado
- Nova renderização com produto cadastrado
Próximas Melhorias
Validação
- Campos obrigatórios
- Formato de preço
- Feedback visual
UX
- Estado de loading
- Animações
- Foco automático
Segurança
- Tratamento de erros
- Timeout de requisição
- Retry automático
Conclusões
- FormData simplifica drasticamente o gerenciamento de formulários
- Callbacks permitem comunicação flexível entre componentes
- Atributo name é essencial para o funcionamento correto
"A implementação demonstrou como combinar APIs nativas do navegador com React pode resultar em soluções mais limpas e eficientes."