Spike
← Back to blog
tutorial·

React Form Best Practices in 2026

Modern React has made form handling much simpler. Here are the patterns we recommend.

Controlled vs Uncontrolled

For simple forms, uncontrolled inputs with FormData work great:

tsx
function ContactForm() {
  const handleSubmit = async (e: FormEvent) => {
    e.preventDefault();
    const data = new FormData(e.currentTarget);
    await fetch('/api/contact', { method: 'POST', body: data });
  };
  
  return <form onSubmit={handleSubmit}>...</form>;
}

Server Actions (Next.js)

With Next.js App Router, you can use server actions:

tsx
async function submitForm(formData: FormData) {
  'use server';
  // Handle submission server-side
}

Form Libraries

For complex forms with validation, consider: - React Hook Form - Formik - Conform

With Spike

The simplest approach - just point to our endpoint:

tsx
<form action="https://spike.ac/api/f/ID" method="POST">
  ...
</form>
```