Building Your Learning Module...
Getting things ready for you!
Find videos you like?
Save to resource drawer for future reference!
An uncontrolled component stores its own state internally in the DOM. You access the value using a ref when needed!
Type and submit! No re-renders until you click submit
function UncontrolledForm() {
const nameRef = React.useRef();
const emailRef = React.useRef();
const [submitted, setSubmitted] = React.useState(null);
const handleSubmit = (e) => {
e.preventDefault();
const data = {
name: nameRef.current.value,
email: emailRef.current.value
};
setSubmitted(data);
};
const handleReset = () => {
nameRef.current.value = '';
emailRef.current.value = '';
setSubmitted(null);
};
return (
<div className="uncontrolled-form">
<h2>⚡ Uncontrolled Form</h2>
<p className="subtitle">DOM manages state, React reads on submit</p>
<form onSubmit={handleSubmit}>
<div className="form-group">
<label>Name</label>
<input
ref={nameRef}
defaultValue="John Doe"
placeholder="Enter name"
/>
</div>
<div className="form-group">
<label>Email</label>
<input
ref={emailRef}
defaultValue="john@example.com"
placeholder="Enter email"
/>
</div>
<div className="button-group">
<button type="submit" className="submit-btn">
Submit Form
</button>
<button type="button" onClick={handleReset} className="reset-btn">
Reset
</button>
</div>
</form>
{submitted && (
<div className="submitted-data">
<strong>📤 Submitted Data:</strong>
<pre>{JSON.stringify(submitted, null, 2)}</pre>
<p className="note">💡 Values accessed only on submit!</p>
</div>
)}
</div>
);
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<UncontrolledForm />);Loading preview...
File inputs cannot be controlled
function FileUpload() {
const fileInputRef = useRef();
const handleSubmit = (e) => {
e.preventDefault();
const file = fileInputRef.current.files[0];
console.log('File:', file.name);
};
return (
<form onSubmit={handleSubmit}>
<input type="file" ref={fileInputRef} />
<button type="submit">Upload</button>
</form>
);
}| Feature | Controlled | Uncontrolled |
|---|---|---|
| Data source | React state | DOM |
| Access value | From state | From ref |
| Re-renders | On every change | Only on submit |
| Validation | Real-time ✅ | On submit only |
| Best for | Most forms | File inputs, simple forms |
Access DOM values directly with useRef
Must be uncontrolled for security reasons
Better performance for simple cases
Prefer controlled for most forms