Resetting or clearing form fields is a very common task in React applications. After a successful form submission, when switching modes (edit vs. create), or when a user hits a Clear button, you often want to bring the form back to a clean or default state.
React gives you full control over this behaviour using:
useRef().useEffect().✨ Goal: Smooth, predictable, user-friendly form behaviour
setState.ref.useEffect() to reset after successful submission.In React, you never directly modify the DOM for controlled inputs. Instead, you reset by changing state:
initialForm or defaultValues object.useState() to initialise the form.setForm(initialForm) or setForm(defaultValues).For uncontrolled components, React doesn't track the input value in state, so you can clear the DOM value directly using:
const inputRef = useRef();inputRef.current.value = ""; to clear the input.To auto-reset after submit, you can:
submitted flag in state.useEffect(), watch this flag and reset the data when it becomes true.All input values are stored in state. Resetting is as simple as setting the state back to the initial object.
// Controlled form: reset fields by restoring initial state
import React, { useState } from "react";
function ResetControlledForm() {
const initialForm = { name: "", email: "", password: "" };
const [form, setForm] = useState(initialForm);
const handleChange = (e) => {
const { name, value } = e.target;
setForm({ ...form, [name]: value }); // Update only the changed field
};
const handleReset = () => {
setForm(initialForm); // Reset all fields back to initial empty values
};
const handleSubmit = (e) => {
e.preventDefault();
alert("Form submitted!"); // Simulate successful submit
handleReset(); // Clear fields after submit
};
return (
<form onSubmit={handleSubmit}>
<h4>Controlled Reset Example</h4>
<input
name="name"
className="form-control mb-2"
placeholder="Enter name"
value={form.name}
onChange={handleChange}
/>
<input
name="email"
className="form-control mb-2"
placeholder="Enter email"
value={form.email}
onChange={handleChange}
/>
<input
name="password"
type="password"
className="form-control mb-3"
placeholder="Enter password"
value={form.password}
onChange={handleChange}
/>
<button className="btn btn-success me-2">Submit</button>
<button
type="button"
className="btn btn-secondary"
onClick={handleReset}
>
Clear
</button>
</form>
);
}
export default ResetControlledForm; // Export component for use in your app
Here, inputs are uncontrolled and their values are stored directly in the DOM. You clear them using refs.
// Uncontrolled form: clear DOM values with refs
import React, { useRef } from "react";
function ClearUncontrolledForm() {
const nameRef = useRef();
const emailRef = useRef();
const clearFields = () => {
nameRef.current.value = ""; // Clear name input
emailRef.current.value = ""; // Clear email input
};
return (
<div>
<h4>Uncontrolled Clear Example</h4>
<input
type="text"
placeholder="Name"
ref={nameRef}
className="form-control mb-2"
/>
<input
type="email"
placeholder="Email"
ref={emailRef}
className="form-control mb-2"
/>
<button className="btn btn-warning" onClick={clearFields}>
Clear Inputs
</button>
</div>
);
}
export default ClearUncontrolledForm; // Use this when you do not need React state
Instead of clearing to empty strings, you can reset to meaningful default values like a default username or country.
// Controlled form: reset to non-empty default values
import React from "react";
function ResetToDefault() {
const defaultValues = {
username: "Guest",
country: "India",
};
const [form, setForm] = React.useState(defaultValues); // Start with defaults
const handleChange = (e) => {
const { name, value } = e.target;
setForm({ ...form, [name]: value }); // Update specific field
};
const resetDefaults = () => {
setForm(defaultValues); // Restore original default settings
};
return (
<div>
<h4>Reset to Default Values</h4>
<input
type="text"
name="username"
className="form-control mb-2"
value={form.username}
onChange={handleChange}
/>
<select
name="country"
className="form-select mb-2"
value={form.country}
onChange={handleChange}
>
<option>India</option>
<option>USA</option>
<option>Japan</option>
</select>
<button className="btn btn-outline-primary" onClick={resetDefaults}>
Reset Defaults
</button>
</div>
);
}
export default ResetToDefault; // Handy for profile or settings forms
You can automatically clear the form after a successful submission using a flag and useEffect().
// Auto-reset form: useEffect runs after a successful submit
import React from "react";
function AutoResetForm() {
const [data, setData] = React.useState({ message: "" });
const [submitted, setSubmitted] = React.useState(false);
const handleSubmit = (e) => {
e.preventDefault();
alert("Form submitted!"); // Simulate API call or save
setSubmitted(true); // Trigger auto-reset
};
React.useEffect(() => {
if (submitted) {
setData({ message: "" }); // Reset the input value
setSubmitted(false); // Reset flag so it can trigger again later
}
}, [submitted]);
return (
<form onSubmit={handleSubmit}>
<h4>Auto Reset with useEffect</h4>
<input
type="text"
className="form-control mb-2"
placeholder="Type message"
value={data.message}
onChange={(e) => setData({ message: e.target.value })}
/>
<button className="btn btn-success">Send</button>
</form>
);
}
export default AutoResetForm; // Great for chat boxes or quick input forms
initialForm object..value to an empty string."Guest" and the country to "India", even if the user changed them.submitted flag is set. The useEffect() hook observes this flag, clears the message, and then switches the flag off again.setState() for controlled components; use ref.current.value = "" for uncontrolled inputs.reset methods for consistency and better validation handling.Goal: Learn how to programmatically reset or clear React form fields using state, refs, and useEffect to build smooth and user-friendly form interactions.