Formulario de encuesta React

Construye un formulario de encuesta en React sin backend. Usa listas desplegables para respuestas rápidas y un campo abierto, y envía el POST a Formpaste. Copia el componente y añade tu clave de acceso: las respuestas llegan a tu bandeja de entrada.

Como construirlo

  1. Crea un formulario en tu panel de Formpaste y copia su clave de acceso.
  2. Copia el componente de React de arriba y elige tu estilo.
  3. Reemplaza YOUR_ACCESS_KEY_HERE con tu clave de acceso y despliega.

Prompt para tu agente de programación con IA

Add a Formpaste survey form to my React app. Use a component with a couple of select dropdowns and a textarea that POSTs as application/x-www-form-urlencoded (URLSearchParams) to https://api.formpaste.com/submit with a hidden access_key input. No backend.

O conecta el servidor MCP de Formpaste con Claude Code, Codex, Cursor, Claude Desktop, VS Code o cualquier cliente mcp-remote. Ver la guía de configuración.

Puntos claves de React

Un formulario de contacto en React es solo un componente con un manejador de submit que envía el POST a Formpaste. No hay backend ni ruta de API propia. Coloca el fetch en un componente que se ejecute en el navegador y ya está.

Es un componente cliente

El fetch del onSubmit se ejecuta en el navegador, así que el formulario vive en un componente cliente normal. En una SPA de React puro todo componente ya es del lado del cliente; en un framework con componentes de servidor, agrega el límite de cliente donde se ejecuta el fetch.

Sin ruta de API, sin proxy

No envías el POST a tu propio endpoint /api para reenviarlo desde ahí. El componente envía el POST directamente al endpoint de Formpaste, lo que elimina todo un viaje de ida y vuelta al servidor y un mailer que de otra forma tendrías que escribir.

Controlado o no controlado, ambos funcionan

Lee los valores desde un FormData sobre el elemento form (no controlado) o desde useState (controlado). No controlado es menos código para un formulario de contacto sencillo; controlado es útil cuando validas mientras el usuario escribe.

Maneja la respuesta en el estado

El endpoint devuelve JSON (success, message, id). Espera el fetch y asigna un estado para mostrar tu propia interfaz de éxito o error, o configura una redirección en el panel y evita el manejo del lado del cliente.

Que debes acertar

Mantenla corta para conservar una alta tasa de finalización

Cada pregunta adicional pierde respuestas. Un par de listas desplegables y un campo de comentario abierto suele reunir lo que necesitas sin generar fatiga.

Las listas desplegables superan al texto libre para el análisis

Las opciones fijas (campos select) son fáciles de contar después. Reserva el textarea para la única pregunta abierta que realmente lo necesite.

Haz que el correo sea opcional para respuestas más honestas

Las respuestas anónimas suelen ser más sinceras. Pide el correo solo si necesitas dar seguimiento, y márcalo como opcional.

Cómo funciona

Tres pasos simples para que los envíos de formularios lleguen a tu bandeja de entrada.
Crea tu formulario, apunta la URL de action al endpoint de Formpaste y añade tu clave de acceso.

1

Crea tu formulario

Regístrate, verifica tu correo y crea una clave de acceso en tu panel.

2

Copia el código

Pega el fragmento de arriba en tu proyecto. Elige CSS o Tailwind para que combine con tu sitio.

export function ContactForm() {
  async function onSubmit(e) {
    e.preventDefault();
    const form = new FormData(e.currentTarget);
    await fetch("https://api.formpaste.com/submit", { method: "POST", body: new URLSearchParams(form) });
  }

  return (
    <form onSubmit={onSubmit} className="mx-auto flex w-full max-w-md flex-col gap-4 rounded-xl border border-gray-200 bg-white p-6 shadow-sm dark:border-gray-800 dark:bg-gray-950">
      <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE" />
      <label className="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Correo electrónico (opcional)
    <input type="email" name="email" placeholder="tu@ejemplo.com" className="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
      <label className="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">¿Qué te describe mejor?
    <select name="role" required className="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100">
      <option>Desarrollador</option>
      <option>Diseñador</option>
      <option>Fundador</option>
      <option>Otro</option>
    </select>
  </label>
      <label className="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">¿Qué tan satisfecho estás?
    <select name="satisfaction" required className="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100">
      <option>Muy satisfecho</option>
      <option>Satisfecho</option>
      <option>Neutral</option>
      <option>Insatisfecho</option>
    </select>
  </label>
      <label className="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">¿Algo más?
    <textarea name="comments" className="min-h-28 rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100"></textarea>
  </label>
      <button type="submit" className="w-full rounded-md bg-gray-900 px-4 py-2 text-sm font-medium text-white shadow-sm transition-colors hover:bg-gray-800 disabled:opacity-60 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-200">Enviar encuesta</button>
    </form>
  );
}
3

Añade tu clave de acceso

Reemplaza el marcador por tu clave de acceso para empezar a recibir envíos.

<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE">

Formulario de encuesta React FAQ

Pega un formulario. Recibe envíos.

Al instante, sin configurar ningún backend, servidor ni base de datos. 250 envíos/mes gratis, sin tarjeta de crédito.

Otros formularios de React