React7 min read

React Forms

Build forms in React - handle text inputs, checkboxes, dropdowns, and form submission.

Sarah Johnson
December 20, 2025
0.0k0

Forms let users enter data - login forms, signup forms, contact forms. Let's learn how to build them in React!

Simple Text Input

```javascript function NameForm() { const [name, setName] = useState('');

return ( <div> <input type="text" value={name} onChange={(e) => setName(e.target.value)} placeholder="Enter your name" /> <p>Hello, {name}!</p> </div> ); } ```

Complete Form Example

```javascript function SignupForm() { const [formData, setFormData] = useState({ username: '', email: '', password: '' });

const handleChange = (e) => { setFormData({ ...formData, [e.target.name]: e.target.value }); };

const handleSubmit = (e) => { e.preventDefault(); console.log('Form submitted:', formData); };

return ( <form onSubmit={handleSubmit}> <input name="username" value={formData.username} onChange={handleChange} placeholder="Username" />

<input name="email" type="email" value={formData.email} onChange={handleChange} placeholder="Email" />

<input name="password" type="password" value={formData.password} onChange={handleChange} placeholder="Password" />

<button type="submit">Sign Up</button> </form> ); } ```

Checkbox

```javascript function TermsForm() { const [agreed, setAgreed] = useState(false);

return ( <div> <label> <input type="checkbox" checked={agreed} onChange={(e) => setAgreed(e.target.checked)} /> I agree to the terms and conditions </label>

<button disabled={!agreed}> Continue </button> </div> ); } ```

Radio Buttons

```javascript function GenderForm() { const [gender, setGender] = useState('');

return ( <div> <label> <input type="radio" value="male" checked={gender === 'male'} onChange={(e) => setGender(e.target.value)} /> Male </label>

<label> <input type="radio" value="female" checked={gender === 'female'} onChange={(e) => setGender(e.target.value)} /> Female </label>

<p>Selected: {gender}</p> </div> ); } ```

Select Dropdown

```javascript function CountryForm() { const [country, setCountry] = useState('usa');

return ( <div> <select value={country} onChange={(e) => setCountry(e.target.value)} > <option value="usa">United States</option> <option value="uk">United Kingdom</option> <option value="canada">Canada</option> <option value="australia">Australia</option> </select>

<p>You selected: {country}</p> </div> ); } ```

Textarea

```javascript function MessageForm() { const [message, setMessage] = useState('');

return ( <div> <textarea value={message} onChange={(e) => setMessage(e.target.value)} placeholder="Enter your message" rows={5} />

<p>Characters: {message.length}</p> </div> ); } ```

Form Validation

Add simple validation to forms:

```javascript function LoginForm() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [errors, setErrors] = useState({});

const validate = () => { const newErrors = {};

if (!email) { newErrors.email = 'Email is required'; } else if (!email.includes('@')) { newErrors.email = 'Email is invalid'; }

if (!password) { newErrors.password = 'Password is required'; } else if (password.length < 6) { newErrors.password = 'Password must be at least 6 characters'; }

return newErrors; };

const handleSubmit = (e) => { e.preventDefault();

const newErrors = validate();

if (Object.keys(newErrors).length === 0) { console.log('Form is valid!'); // Submit form } else { setErrors(newErrors); } };

return ( <form onSubmit={handleSubmit}> <div> <input type="email" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="Email" /> {errors.email && <p style={{color: 'red'}}>{errors.email}</p>} </div>

<div> <input type="password" value={password} onChange={(e) => setPassword(e.target.value)} placeholder="Password" /> {errors.password && <p style={{color: 'red'}}>{errors.password}</p>} </div>

<button type="submit">Login</button> </form> ); } ```

Multiple Inputs with One Handler

Handle multiple inputs efficiently:

```javascript function ContactForm() { const [formData, setFormData] = useState({ name: '', email: '', phone: '', message: '' });

const handleChange = (e) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); };

return ( <form> <input name="name" value={formData.name} onChange={handleChange} placeholder="Name" /> <input name="email" value={formData.email} onChange={handleChange} placeholder="Email" /> <input name="phone" value={formData.phone} onChange={handleChange} placeholder="Phone" /> <textarea name="message" value={formData.message} onChange={handleChange} placeholder="Message" /> <button type="submit">Send</button> </form> ); } ```

Clear Form After Submit

```javascript function FeedbackForm() { const [feedback, setFeedback] = useState('');

const handleSubmit = (e) => { e.preventDefault(); console.log('Feedback:', feedback); setFeedback(''); // Clear form alert('Thanks for your feedback!'); };

return ( <form onSubmit={handleSubmit}> <textarea value={feedback} onChange={(e) => setFeedback(e.target.value)} placeholder="Share your feedback" /> <button type="submit">Submit</button> </form> ); } ```

Form Tips

**Controlled Components:** - Form value is stored in state - React controls the input value - More predictable behavior

```javascript <input value={name} onChange={(e) => setName(e.target.value)} /> ```

**Prevent Default:** Always use `e.preventDefault()` in onSubmit to stop page reload

**Validation:** Validate before submitting - check required fields, email format, etc.

Remember

- Store form data in state - Use `value` and `onChange` for controlled inputs - Use `e.preventDefault()` in onSubmit - Validate data before submission - Show error messages clearly - Clear form after successful submit - Use `name` attribute for multiple inputs

> Next: Learn Conditional Rendering - Show/hide content based on conditions!

#React#Forms#Input#Validation#Beginner