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
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
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
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
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
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
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:
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:
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
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
<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
valueandonChangefor controlled inputs - Use
e.preventDefault()in onSubmit - Validate data before submission
- Show error messages clearly
- Clear form after successful submit
- Use
nameattribute for multiple inputs
Next: Learn Conditional Rendering - Show/hide content based on conditions!
#React#Forms#Input#Validation#Beginner