snippetjavascriptreactModeratepending
React form handling with controlled components
Viewed 0 times
controlled componentsform handlinguseformvalidationreact forms
Problem
Need patterns for handling forms in React: controlled inputs, validation, multi-field forms, and submission.
Solution
React form patterns:
import { useState, useCallback } from 'react';
// 1. Single controlled input
function SearchBox() {
const [query, setQuery] = useState('');
return (
<input
value={query}
onChange={e => setQuery(e.target.value)}
placeholder="Search..."
/>
);
}
// 2. Multi-field form with single state object
function SignupForm() {
const [form, setForm] = useState({
name: '',
email: '',
password: '',
});
const [errors, setErrors] = useState({});
const handleChange = useCallback((e) => {
const { name, value } = e.target;
setForm(prev => ({ ...prev, [name]: value }));
// Clear error on change
setErrors(prev => ({ ...prev, [name]: '' }));
}, []);
const validate = () => {
const newErrors = {};
if (!form.name.trim()) newErrors.name = 'Name is required';
if (!form.email.includes('@')) newErrors.email = 'Invalid email';
if (form.password.length < 8) newErrors.password = 'Min 8 characters';
setErrors(newErrors);
return Object.keys(newErrors).length === 0;
};
const handleSubmit = async (e) => {
e.preventDefault();
if (!validate()) return;
// Submit form data
await api.signup(form);
};
return (
<form onSubmit={handleSubmit}>
<div>
<input name="name" value={form.name} onChange={handleChange} />
{errors.name && <span className="error">{errors.name}</span>}
</div>
<div>
<input name="email" type="email" value={form.email} onChange={handleChange} />
{errors.email && <span className="error">{errors.email}</span>}
</div>
<div>
<input name="password" type="password" value={form.password} onChange={handleChange} />
{errors.password && <span className="error">{errors.password}</span>}
</div>
<button type="submit">Sign Up</button>
</form>
);
}
// 3. Custom hook for reusable form logic
function useForm(initialValues, validate) {
const [values, setValues] = useState(initialValues);
const [errors, setErrors] = useState({});
const [submitting, setSubmitting] = useState(false);
const handleChange = (e) => {
const { name, value, type, checked } = e.target;
setValues(prev => ({
...prev,
[name]: type === 'checkbox' ? checked : value,
}));
};
const handleSubmit = (onSubmit) => async (e) => {
e.preventDefault();
const validationErrors = validate(values);
setErrors(validationErrors);
if (Object.keys(validationErrors).length === 0) {
setSubmitting(true);
await onSubmit(values);
setSubmitting(false);
}
};
return { values, errors, submitting, handleChange, handleSubmit };
}Why
Controlled components give React full control over form state, enabling validation, conditional rendering, and submission handling without DOM manipulation.
Context
React form implementation
Revisions (0)
No revisions yet.