What are controlled and uncontrolled components in React forms?
Jul 09, 2025 am 12:44 AMIn a React form, controlled components use React state to manage data, while non-controlled components rely on DOM to process data. 1. The controlled component controls the input value through the state. Each user input will trigger the event update status and can verify or format the data in real time; 2. The uncontrolled component uses ref to obtain the DOM value, which is suitable for obtaining data only when submitting or integrating with third-party libraries; 3. The selection is based on whether the form data needs to be fine-grained and real-time interaction.
In React forms, the difference between controlled and uncontrolled components come down to how form data is handled. Controlled components use React state to manage and update input values, while uncontrolled components rely on the DOM itself to handle the data.

What Are Controlled Components?
Controlled components are those where form data is managed by React's state. Every time a user types into an input field, the component updates the state via an event handler, and the input value is tied directly to that state.

This gives you more control over the form data — you can validate inputs as they type, format values ??on the fly, or even reset fields programmatically.
For example:

- You have an
<input>
field for a username. - That input's
value
is set to a state variable likeusername
. - The
onChange
handler updates that state every time the user types.
Here's what it looks like in code:
function UsernameForm() { const [username, setUsername] = useState(''); function handleChange(e) { setUsername(e.target.value); } Return ( <form> <input type="text" value={username} onChange={handleChange} /> </form> ); }
Key points:
- The input value always reflects the current state.
- You can manipulate or validate the value before updating the state.
- This pattern works well with form validation libraries or when you need real-time feedback.
What Are Uncontrolled Components?
Uncontrolled components, on the other hand, let the DOM handle the form data. Instead of setting the value through state, you retrieve it when needed — typically using a ref.
They're useful if you want a quick-and-dirty form without managing every change in state. They also feel closer to traditional HTML forms.
To get the value from an uncontrolled input, you'd typically use a ref
, like this:
function UsernameForm() { const inputRef = useRef(); function handleSubmit(e) { e.preventDefault(); console.log(inputRef.current.value); } Return ( <form onSubmit={handleSubmit}> <input type="text" ref={inputRef} /> <button type="submit">Submit</button> </form> ); }
You might see these used in cases where:
- You don't need to track every keystroke.
- You're integrating with non-React code or third-party libraries.
- Performance isn't a concern and you just want something simple.
One thing to note: default values ??can be set with the defaultValue
prop instead of value
.
When to Use Each Type
Choosing between controlled and uncontrolled depends on your needs:
Use controlled components when:
- You need to validate or format input as the user types.
- You want to enable/disable buttons based on input state.
- You're building reusable form components or using form state across multiple parts of your app.
Use uncontrolled components when:
- You only care about the value when the form is submitted.
- You're dealing with a lot of inputs and tracking each one in state feels heavy.
- You're migrating old code or working with external libraries that expect direct DOM access.
There's no strict rule here — sometimes mixing both in different parts of the same form makes sense.
Ultimately, the choice depends on how much control you need over the form data. Controlled components give you more flexibility, while uncontrolled ones are simpler and less state-heavy. Both have their place depending on the situation.
Basically that's it.
The above is the detailed content of What are controlled and uncontrolled components in React forms?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

React itself does not directly manage focus or accessibility, but provides tools to effectively deal with these issues. 1. Use Refs to programmatically manage focus, such as setting element focus through useRef; 2. Use ARIA attributes to improve accessibility, such as defining the structure and state of tab components; 3. Pay attention to keyboard navigation to ensure that the focus logic in components such as modal boxes is clear; 4. Try to use native HTML elements to reduce the workload and error risk of custom implementation; 5. React assists accessibility by controlling the DOM and adding ARIA attributes, but the correct use still depends on developers.

WebAssembly(WASM)isagame-changerforfront-enddevelopersseekinghigh-performancewebapplications.1.WASMisabinaryinstructionformatthatrunsatnear-nativespeed,enablinglanguageslikeRust,C ,andGotoexecuteinthebrowser.2.ItcomplementsJavaScriptratherthanreplac

Server-siderendering(SSR)inNext.jsgeneratesHTMLontheserverforeachrequest,improvingperformanceandSEO.1.SSRisidealfordynamiccontentthatchangesfrequently,suchasuserdashboards.2.ItusesgetServerSidePropstofetchdataperrequestandpassittothecomponent.3.UseSS

Immutable updates are crucial in React because it ensures that state changes can be detected correctly, triggering component re-rendering and avoiding side effects. Directly modifying state, such as push or assignment, will cause React to be unable to detect changes. The correct way to do this is to create new objects instead of old objects, such as updating an array or object using the expand operator. For nested structures, you need to copy layer by layer and modify only the target part, such as using multiple expansion operators to deal with deep attributes. Common operations include updating array elements with maps, deleting elements with filters, adding elements with slices or expansion. Tool libraries such as Immer can simplify the process, allowing "seemingly" to modify the original state but generate new copies, but increase project complexity. Key tips include each

Front-end applications should set security headers to improve security, including: 1. Configure basic security headers such as CSP to prevent XSS, X-Content-Type-Options to prevent MIME guessing, X-Frame-Options to prevent click hijacking, X-XSS-Protection to disable old filters, HSTS to force HTTPS; 2. CSP settings should avoid using unsafe-inline and unsafe-eval, use nonce or hash and enable reporting mode testing; 3. HTTPS-related headers include HSTS automatic upgrade request and Referrer-Policy to control Referer; 4. Other recommended headers such as Permis

The data-* attribute is used in HTML to store additional data, and its advantages include that the data is closely related to elements and comply with HTML5 standards. 1. When using it, name it starts with data-, such as data-product-id; 2. It can be accessed through JavaScript's getAttribute or dataset; 3. Best practices include avoiding sensitive information, reasonable naming, paying attention to performance and not replacing state management.

To style SVGs using CSS, you first need to embed SVGs inline into HTML for fine control. 1. Inline SVG allows its internal elements such as or to be directly selected through CSS and to apply styles, while external SVG only supports global styles such as width and height or filters. 2. Use regular CSS syntax such as .class:hover to achieve interactive effects, but use fill instead of color to control the color, and use stroke and stroke-width to control the outline. 3. Use class names to organize styles to avoid duplication and pay attention to naming conflicts and scope management. 4. The SVG style may be inherited from the page, and can be reset through svg*{fill:none;stroke:none;} to avoid

Adding website Favicon requires preparing icon files, placing the correct path and quoting them. 1. Prepare multi-size .ico or .png icons, which can be generated by online tools; 2. Put favicon.ico in the website root directory; 3. If you need to customize the path or support more devices, you need to add a link tag reference in the HTMLhead; 4. Clear the cache or use the tool to check whether it is effective.
