Forms collect user input — text fields, checkboxes, dropdowns, textareas. React handles forms with controlled components.
Text input
JSX
function NameForm() {
const [name, setName] = useState('');
const handleSubmit = (e) => {
e.preventDefault();
alert(`Hello, ${name}!`);
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
placeholder="Enter your name"
/>
<button type="submit">Greet</button>
</form>
);
}Textarea
JSX
function BioForm() {
const [bio, setBio] = useState('');
return (
<textarea
value={bio}
onChange={(e) => setBio(e.target.value)}
placeholder="Tell us about yourself..."
rows={4}
/>
);
}Select dropdown
JSX
function CourseSelect() {
const [course, setCourse] = useState('');
return (
<select value={course} onChange={(e) => setCourse(e.target.value)}>
<option value="">Choose a course</option>
<option value="python">Python</option>
<option value="javascript">JavaScript</option>
<option value="react">React</option>
</select>
);
}Checkbox
JSX
function TermsCheckbox() {
const [accepted, setAccepted] = useState(false);
return (
<label>
<input
type="checkbox"
checked={accepted}
onChange={(e) => setAccepted(e.target.checked)}
/>
I accept the terms
</label>
);
}Multiple fields
JSX
function SignupForm() {
const [form, setForm] = useState({ name: '', email: '', age: '' });
const update = (field) => (e) => {
setForm({ ...form, [field]: e.target.value });
};
const handleSubmit = (e) => {
e.preventDefault();
console.log(form);
};
return (
<form onSubmit={handleSubmit}>
<input value={form.name} onChange={update('name')} placeholder="Name" />
<input value={form.email} onChange={update('email')} placeholder="Email" />
<input value={form.age} onChange={update('age')} placeholder="Age" />
<button type="submit">Sign up</button>
</form>
);
}Tips
- Always use controlled components (
value+onChange). - Use
e.preventDefault()inonSubmitto prevent page reload. - Group related fields into a single state object.
- Validate on submit, not on every keystroke (unless you need instant feedback).
Next: effects.