Formulários
O React tem algumas particularidades em relação a formulários, vamos aprender como lidar com elas, implementando a interação do formulário de contato do nosso projeto.
Formulários controlados x não controlados
Existem duas principais abordagens para lidar com formulários no React:
- Formulários controlados: O estado do formulário é gerenciado pelo componente React.
- Formulários não controlados: O estado do formulário é gerenciado pelo DOM.
Formulários não controlados
Essa abordagem é mais próxima do HTML tradicional, onde o estado do formulário é gerenciado pelo DOM. Ela traz algumas vantagens, como a simplicidade e a facilidade de uso, mas também algumas desvantagens, como a dificuldade de validação e a falta de controle sobre o estado do formulário.
function ContactForm() { const handleSubmit = (e) => { e.preventDefault(); const name = e.target.elements.name.value; alert(`Name: ${name}`); };
return ( <form onSubmit={handleSubmit}> <input type="text" name="name" placeholder="Enter name" /> <button type="submit">Submit</button> </form> );}
Formulários controlados
Nesse caso, vamos usar o useState
para guardar o estado de cada campo do formulário. Dessa forma, conseguimos ter um controle maior sobre o estado. Por exemplo: podemos fazer validações enquanto o usuário está preenchendo o formulário, podemos fazer consultas na API enquanto ele está digitando, etc. Por outro lado, o código fica um pouco mais complexo e dependendo do form pode ficar mais lento, já que o formulário é renderizado a cada vez que o estado é alterado.
function ContactForm() { const [name, setName] = useState("");
const handleSubmit = (e) => { e.preventDefault(); alert(`Name: ${name}`); };
return ( <form onSubmit={handleSubmit}> <input type="text" value={name} onChange={(e) => setName(e.target.value)} /> <button type="submit">Submit</button> </form> );}
Implementando o formulário de contato
import { useState } from "react";
function ContactForm() { const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [message, setMessage] = useState("");
const handleSubmit = (e) => { e.preventDefault();
alert(`Name: ${name}, Email: ${email}, Message: ${message}`);
fetch("https://api.example.com/contact", { method: "POST", body: JSON.stringify({ name, email, message }), }) .then((response) => response.json()) .then((data) => { alert("Mensagem enviada com sucesso!"); }); };
return ( <section className="py-16 bg-gray-100"> <div className="container mx-auto max-w-md"> <h2 className="text-3xl font-bold mb-8 text-center text-gray-700"> Entre em Contato </h2> <div className="bg-white rounded-lg shadow-md p-6 border-t-4 border-violet-400"> <form onSubmit={handleSubmit} className="space-y-4"> <div> <label htmlFor="nome" className="block text-sm font-medium text-gray-700 mb-1" > Nome </label> <input id="nome" type="text" value={name} onChange={(e) => setName(e.target.value)} placeholder="Seu nome" className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-violet-400 focus:border-violet-400" /> </div> <div> <label htmlFor="email" className="block text-sm font-medium text-gray-700 mb-1" > E-mail </label> <input id="email" type="email" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="Seu e-mail" className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-violet-400 focus:border-violet-400" /> </div> <div> <label htmlFor="mensagem" className="block text-sm font-medium text-gray-700 mb-1" > Mensagem </label> <textarea id="mensagem" rows={4} value={message} onChange={(e) => setMessage(e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-violet-400 focus:border-violet-400" placeholder="Sua mensagem" ></textarea> </div> <button type="submit" className="w-full bg-violet-500 text-white px-4 py-2 rounded-md hover:bg-violet-400 focus:outline-none focus:ring-2 focus:ring-violet-400 focus:ring-offset-2" > Enviar Mensagem </button> </form> </div> </div> </section> );}
export default ContactForm;