Añade un formulario a una aplicación React existente
En esta guía, añades el formulario de registro de casos a una aplicación React que ya tienes. Cuando termines:
- el formulario se ejecutará en una página de tu aplicación;
- cada envío llegará a tu propia API como un registro estructurado;
- tu servidor volverá a comprobar el registro antes de guardarlo; y
- un guardado fallido mostrará un mensaje y conservará lo que escribió el usuario.
Tiempo: unos 20 minutos.
Antes de empezar
- Node.js
22o posterior - Una aplicación React 18 o 19. Los pasos usan Vite. Con otra herramienta de compilación, adapta el paso del proxy.
box-sizing: border-boxen todos los elementos. La mayoría de los resets de CSS lo establecen, incluido el de Tailwind. Sin esto, los campos del formulario se salen de su contenedor.
Para seguir la guía con una aplicación nueva, créala con Vite:
Code
Después sustituye el contenido de src/index.css por esta regla. Establece box-sizing y elimina
el texto centrado de la plantilla:
Code
Añade el formulario
-
Instala los paquetes de form0:
Code -
Descarga el esquema de Crea un formulario de registro de casos. Si ya creaste ese formulario, copia tu propio
schema.jsona esta ruta.Code -
Crea
src/CaseIntakeForm.jsx:CoderecordKindindica a form0 si este formulario crea un registro nuevo o abre uno guardado, yFormRendererlo requiere.formWidthestablece el ancho máximo del formulario, que es30vwpor defecto. -
Muestra el formulario en una página. En una aplicación Vite nueva, sustituye el contenido de
src/App.jsx:CodeEn tu propia aplicación, renderiza
<CaseIntakeForm />en la página donde deba ir el formulario. -
Inicia la aplicación y abre la URL que muestra, normalmente
http://localhost:5173:CodeRellena los campos obligatorios y haz clic en Submit. La consola del navegador muestra el registro estructurado.
FormRenderer muestra su encabezado estándar, el panel de navegación y los metadatos del registro.
Para cambiar el aspecto del formulario, consulta
Temas y estilos.

Envía registros a tu API
-
Sustituye
src/CaseIntakeForm.jsxpor esta versión, que envía cada registro a/api/cases:CodeAquí importan tres detalles:
fetchno rechaza la promesa ante una respuesta500, así que el código compruebaresponse.oky lanza un error.- El bloque
catchmuestra un mensaje y después vuelve a lanzar el error. Sin elthrow,FormRendererconsidera que el guardado ha salido bien. - Al cambiar
key, un formulario nuevo y vacío sustituye al anterior después de un guardado correcto.
-
Crea
server/cases-api.mjs. Este ejemplo solo usa Node.js yform0-core:CodeEl servidor lee el mismo archivo de esquema que el formulario, así que ambos aplican las mismas reglas. Crea un evaluador nuevo para cada petición porque una llamada a
prepareSubmission()cancela cualquier llamada anterior que siga en curso en el mismo evaluador. -
Reenvía las peticiones de
/apia ese servidor durante el desarrollo. Sustituyevite.config.jspor:Code -
Inicia la API en un segundo terminal, desde la raíz del proyecto:
CodeMuestra
Cases API listening on port 3001.
Pruébalo
Mantén los dos terminales en marcha, abre el formulario y sigue estos pasos.
-
Envía un formulario vacío. Haz clic en Submit. Los campos obligatorios muestran sus mensajes y el terminal de la API no muestra nada.
-
Guarda un caso. Rellena Full name, elige Email como método de contacto y rellena Email y Summary. Elige My team, responde Yes a Is work blocked?, rellena Describe the business impact y haz clic en Submit. La página muestra Case saved., el formulario se vacía y el terminal de la API muestra
Saved case:conpriority: 'high'. -
Haz que falle un guardado. Detén la API con
Ctrl+C, vuelve a rellenar el formulario y haz clic en Submit. La página muestra The case was not saved. Try again., tus valores siguen en el formulario y la consola del navegador muestra[form0-react] Submit failed during onSubmit. -
Reintenta. Vuelve a iniciar la API y haz clic en Submit. El caso se guarda.
-
Envía un registro incompleto. Llama directamente a la API, sin el formulario:
CodeEl servidor responde
422y enumera los campos que faltan. -
Envía una prioridad incorrecta. Guarda este registro como
tampered-case.json. Sus respuestas dan una prioridadlow, pero el registro indicahigh:CodeEnvíalo a la API:
CodeEl servidor responde
201y el terminal de la API muestrapriority: 'low'. El servidor calcula por sí mismo los campos calculados.
Cómo funciona
La validación se ejecuta dos veces
FormRenderer valida en el navegador, de modo que el usuario recibe respuesta inmediata y
onSubmit solo se ejecuta con un formulario válido. Un cliente puede saltarse ese paso, así que
checkRecord() repite la comprobación en el servidor:
buildFormRecordSnapshot()convierte el registro recibido en valores del formulario y elimina los campos que no están en el esquema. Lanza un error si el registro está mal formado, y el servidor responde400.prepareSubmission()vuelve a ejecutar los cálculos y aplica las reglas del esquema.eligibleindica si el registro ha pasado la comprobación.createStructuredRecord()crea el registro que se va a guardar a partir de los valores comprobados, de modo que contiene los resultados calculados por el servidor.
Qué cubre la comprobación del servidor
El servidor aplica las reglas de tu esquema y comprueba que cada valor tenga el tipo correcto:
| Un cliente envía | Resultado |
|---|---|
| Un campo obligatorio vacío, incluido uno obligatorio por condición | Se rechaza con 422 |
| Un valor de selección que no está en el esquema | Se rechaza con 422 |
| Un valor calculado modificado | Se sustituye por el resultado del servidor |
| Un campo que no está en el esquema | Se elimina |
| Un campo de selección con una estructura incorrecta | Se rechaza con 400 |
Una fecha mal formada, como not-a-date | Se rechaza con 422 |
Un número en un TextField | Se rechaza con 422 |
| Un valor de tipo incorrecto en un campo oculto | Se rechaza con 422 |
| Un valor válido en un campo oculto | Se guarda con el registro |
El servidor rechaza un tipo incorrecto en un campo oculto porque checkRecord() pasa
validateHiddenValues: true. Un valor válido se mantiene porque form0 conserva los valores ocultos
de forma predeterminada. Para borrar un campo cuando se oculta, define
"visible_preserve_value": false en el esquema.
Estas comprobaciones solo conocen tu esquema. Añade tus propias comprobaciones antes de guardar, por ejemplo si este usuario puede crear el caso.
Antes de pasar a producción
Este ejemplo es breve para que las llamadas a form0 se vean con facilidad. Antes de usarlo de verdad:
- Añade autenticación y un límite para el tamaño de las peticiones.
- Guarda
checkedRecorden tu base de datos en lugar de mostrarlo. Los conectores pueden almacenar registros de form0 en PostgreSQL o SQLite. - Mantén el esquema en tu servidor. Nunca aceptes un esquema de un cliente, porque los esquemas contienen código que se ejecuta en tu servidor.
Por dónde seguir
- Valores, snapshots y envío: restaura registros guardados y observa borradores.
- FormRenderer: todas las propiedades del componente.
- Salida y registros: la estructura del registro que recibes.