React | When to Use FormData in React

Quick notes on when to use FormData vs just using React state.

✅ Use FormData when...

1. Uploading files (e.g. images)

Files can’t be sent via JSON.stringify()
FormData handles multipart/form-data for you

const handleSubmit = (e) => {
  e.preventDefault();
  const formData = new FormData(e.target);
  fetch('/api/upload', {
    method: 'POST',
    body: formData,
  });
};

2. Big forms with lots of fields

Avoid managing 10+ fields with useState
Just collect all values from the form at once

const UncontrolledInputs = () => {
  const [value, setValue] = useState(0);

  const handleSubmit = (e) => {
    e.preventDefault();

    const formData = new FormData(e.currentTarget);
    const newUser = Object.fromEntries(formData);
    console.log(newUser);

    setValue(value + 1); // triggers re-render even though it's not shown in UI
    e.currentTarget.reset(); // clears input after submit
  };

  return (
    <form onSubmit={handleSubmit}>
      <input name="name" placeholder="Name" />
      <input name="email" placeholder="Email" />
      <button type="submit">Submit</button>
    </form>
  );
};

This approach is useful when:

  • You don’t need live validation

  • You're working with lots of fields

  • You want to keep things simple and "uncontrolled"

3. Backend expects multipart/form-data

Some APIs require this format

const handleSubmit = async (e) => {
  e.preventDefault();
  const formData = new FormData();
  formData.append('title', 'My Post');
  formData.append('description', 'This is a test');

  await fetch('/api/posts', {
    method: 'POST',
    body: formData,
  });
};

⚠️ Use state when...

Small forms, text inputs
Need live validation or UI logic

const [email, setEmail] = useState('');
<input value={email} onChange={(e) => setEmail(e.target.value)} />

📌 Summary

SituationUse
Small form, validationuseState
File uploadFormData
Backend needs multipartFormData
Large form, no live updatesFormData
1
Subscribe to my newsletter

Read articles from Valencia Miyeon Jang directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Valencia Miyeon Jang
Valencia Miyeon Jang

Front-end developer with a background in Korean language QA and education.Experienced in localisation testing, cross-functional teamwork, and user-focused development.I enjoy crafting intuitive web experiences with React, Next.js, and TypeScript — always learning, always building.