DEV Community

Cover image for Mastering Form Handling in React: The Ultimate Guide
Hiba Baeej
Hiba Baeej

Posted on

Mastering Form Handling in React: The Ultimate Guide

Forms are a vital part of web applications, enabling users to interact with the system. In React, form handling can be approached in different ways, each with its own benefits and challenges. In this article, we’ll explore three approaches:

1. Controlled Forms
2. Uncontrolled Forms
3. Controlled and Uncontrolled Forms with react-hook-form

Let's break down each method, highlighting key points like performance, validation, scalability, and ease of use.

1. Controlled Forms

What is a Controlled Form?

In controlled forms, the form data is managed entirely by React. Each input field is bound to the component's state, and any changes to the input reflect in the state immediately. You gain full control over the form, which can be beneficial for complex use cases.

Example Code:
`
import React, { useState } from 'react';

function ControlledForm() {
const [formData, setFormData] = useState({ name: '', email: '' });

const handleChange = (e) => {
setFormData({ ...formData, [e.target.name]: e.target.value });
};

const handleSubmit = (e) => {
e.preventDefault();
console.log(formData);
};

return (


type="text"
name="name"
value={formData.name}
onChange={handleChange}
/>
type="email"
name="email"
value={formData.email}
onChange={handleChange}
/>
Submit

);
}
`

Key Points:

  • State Management: The form’s state (input values) is controlled by React using useState.
  • Real-Time Validation: You can easily validate inputs on every keypress by updating state and conditionally displaying error messages.
  • Scalability: For small to medium forms, this approach works great, but as the number of inputs grows, managing state can become cumbersome.

Benefits:

  • Full control over form data.
  • Easy to track and validate form input.
  • Ideal for complex forms where validation needs to happen immediately.

Drawbacks:

  • Can become bloated for large forms, as every input needs its own state handler.
  • Every keystroke causes a re-render, which may impact performance in large-scale applications.

2. Uncontrolled Forms

What is an Uncontrolled Form?

In uncontrolled forms, form data is handled by the DOM itself. Instead of keeping track of form input in React's state, you use refs to access form values when needed (e.g., on form submission).

Example Code:

`
import React, { useRef } from 'react';

function UncontrolledForm() {
const nameInputRef = useRef(null);
const emailInputRef = useRef(null);

const handleSubmit = (e) => {
e.preventDefault();
const formData = {
name: nameInputRef.current.value,
email: emailInputRef.current.value,
};
console.log(formData);
};

return (




Submit

);
}
`

Key Points:

  • Refs: Instead of binding inputs to state, useRef is used to directly access the DOM elements.
  • Less React Overhead: React doesn’t need to re-render the component on every input change, which can improve performance for large forms.

Benefits:

  • Simplifies form handling by reducing state management.
  • May improve performance in large forms since inputs are not constantly re-rendered.
  • Useful for simple forms where real-time validation is not needed.

Drawbacks:

  • Harder to validate input data in real-time.
  • You lose control over form data between renders, which makes managing complex forms difficult.

3. Controlled and Uncontrolled Forms with react-hook-form

What is react-hook-form?

react-hook-form is a library that provides an easy way to handle forms in React. It manages form validation, handles both controlled and uncontrolled inputs, and improves performance by minimizing re-renders.

Example Code:

`
import React from 'react';
import { useForm } from 'react-hook-form';

function HookForm() {
const { register, handleSubmit, formState: { errors } } = useForm();

const onSubmit = (data) => {
console.log(data);
};

return (


{...register('name', { required: 'Name is required' })}
/>
{errors.name && {errors.name.message}}
  <input
    type="email"
    {...register('email', { required: true })}
  />
  {errors.email && <span>Email is required</span>}

  <button type="submit">Submit</button>
</form>

);
}
`

Key Points:

  • Minimal Re-Renders: react-hook-form optimizes form handling by avoiding re-renders of the component on each input change, improving performance.
  • Built-In Validation: You can define validation rules directly within the register method, allowing for cleaner and easier validation.

Benefits:

  • Performance: Only the fields that are actively being interacted with will re-render, keeping the rest of the form performant.
  • Less Boilerplate: It reduces the amount of code you need to write for validation and form handling.
  • Scalable: Perfect for both simple and complex forms, especially as your form grows in size and complexity.

Drawbacks:

  • For very simple forms, react-hook-form may feel like overkill.
  • If unfamiliar with the library, there may be a slight learning curve.

When to Use Each Approach

  • Controlled Forms: Ideal when you need full control over inputs, real-time validation, or are dealing with small-to-medium forms.
  • Uncontrolled Forms: Best for simple forms where validation is not complex, or if performance is critical in scenarios where real-time input tracking isn’t necessary.
  • react-hook-form: The go-to choice for large forms, as it simplifies form state management, reduces re-renders, and provides built-in validation capabilities.

Conclusion
Handling forms in React can be as simple or complex as the project requires. Understanding the differences between controlled and uncontrolled forms and how to leverage a tool like react-hook-form can significantly improve the way you handle forms in your application.

And what about you.

Which approach do you use for handling forms in React?

links:
https://react-hook-form.com/

https://legacy.reactjs.org/docs/forms.html

https://legacy.reactjs.org/docs/uncontrolled-components.html

ReactJS #WebDevelopment #Frontend #FormsInReact

Top comments (0)