Saltar al contenido
Meeko
Escribe para buscar en las guías y en la referencia de la API. Ábrela desde cualquier página con / o Ctrl K; muévete con las flechas y entra con Intro.
Empezar

Contenidos

En esta página

Form

interfaz Desde 1.2.0 Sin import

Estado de un formulario que devuelve useForm. fields son señales escribibles, una por campo; las demás propiedades son señales de sólo lectura.

Se autoimporta en los componentes y en app/.

ts
import type { Form } from "@meekojs/meeko/framework";

Código fuente src/app/composables/useForm.ts:66

Declaración #

ts
interface Form<Values, Result> {
	readonly fields: { readonly [K in keyof Values]: Signal<Values[K]> }
	readonly errors: ReadonlySignal<{ readonly [P in Paths<Values>]?: string }>
	readonly error: ReadonlySignal<string | null>
	readonly failure: ReadonlySignal<Error | null>
	readonly pending: ReadonlySignal<boolean>
	readonly submitted: ReadonlySignal<boolean>
	readonly dirty: ReadonlySignal<boolean>
	readonly submit: (event?: Event) => Promise<Result | undefined>
	readonly reset: { (values?: Partial<Values>): void; (event: Event): void }
	readonly load: (values: Partial<Values>) => void
	readonly trySubmit: (event?: Event) => Promise<FormSubmission<Result>>
	readonly commit: (values?: Partial<Values>) => void
	readonly field: <K extends keyof Values & string>(name: K) => FormField<Values[K]>
	readonly csrfToken: string | undefined
}

Parámetros de tipo #

Values

Valores de los campos: la entrada del schema o, sin schema, el tipo de initial.

Result

Lo que devuelve submit cuando el envío termina bien.

Ejemplo #

meeko
<!-- app/components/NameField.meeko: un campo que recibe el formulario del padre -->
<script lang="ts">
import type { Form } from "@meekojs/meeko/framework";
const props = defineProps<{ form: Form<{ name: string }, unknown> }>();
</script>
<template>
  <input model="props.form.fields.name" bind:aria-invalid="props.form.errors.value.name ? 'true' : null">
  <p if:when="props.form.errors.value.name">{props.form.errors.value.name}</p>
</template>

Propiedades #

fields #

propiedad sólo lectura

readonly fields: { readonly [K in keyof Values]: Signal<Values[K]> }

Una señal escribible por campo, con el valor de initial; se usa con model y model:value.

errors #

propiedad sólo lectura

readonly errors: ReadonlySignal<{ readonly [P in Paths<Values>]?: string }>

Primer mensaje de cada campo con un error, por ruta ("name", "items.0.name"): de la validación del navegador o de los issues de un 400 del servidor. Un campo sin error no tiene clave.

error #

propiedad sólo lectura

readonly error: ReadonlySignal<string | null>

Mensaje del formulario completo, o null: un issue con ruta "" o de un campo que el formulario no tiene, o el texto de un error que no es de validación (véase errorMessage).

failure #

propiedad sólo lectura

readonly failure: ReadonlySignal<Error | null>

Error original del último envío fallido (también el ClientError de un 400), o null.

pending #

propiedad sólo lectura

readonly pending: ReadonlySignal<boolean>

true mientras se valida de forma asíncrona o se ejecuta submit.

submitted #

propiedad sólo lectura

readonly submitted: ReadonlySignal<boolean>

true cuando el último envío terminó bien; vuelve a false al enviar de nuevo y con reset.

dirty #

propiedad sólo lectura

readonly dirty: ReadonlySignal<boolean>

true si algún campo difiere (comparando arrays y objetos por contenido) de los valores iniciales.

submit #

propiedad sólo lectura

readonly submit: (event?: Event) => Promise<Result | undefined>

Envía el formulario: llama a event.preventDefault(), valida con el schema, ejecuta submit con su salida y lleva los errores a errors y error. Resuelve con lo que devuelve submit, o con undefined si los datos no son válidos, si el envío falla o si ya hay uno en curso (se ignora). Nunca rechaza. En SSR no hace nada.

reset #

propiedad sólo lectura

readonly reset: { (values?: Partial<Values>): void; (event: Event): void }

Vuelve a initial, o a initial combinado con values. Borra los errores y el estado del último envío. También sirve como handler de reset en un <form> nativo.

load #

propiedad sólo lectura

readonly load: (values: Partial<Values>) => void

Carga valores en los campos (por ejemplo, un registro para editar). Las claves omitidas conservan su valor actual. Los valores cargados son la nueva referencia de dirty, pero reset() siempre vuelve al initial declarado. Limpia errores y estado del último envío.

trySubmit #

propiedad sólo lectura desde 1.5.0

readonly trySubmit: (event?: Event) => Promise<FormSubmission<Result>>

Envía el formulario como submit, pero resuelve con un FormSubmission que dice cómo terminó: { ok: true, result }, o { ok: false, reason } con "invalid", "error" o "skipped". Nunca rechaza.

commit #

propiedad sólo lectura desde 1.5.0

readonly commit: (values?: Partial<Values>) => void

Escribe values en sus campos y toma los valores de todos los campos como los nuevos valores iniciales de dirty: dirty vuelve a false. A diferencia de reset, no borra submitted, errors, error ni failure. Sirve tras guardar, para que lo guardado sea la nueva referencia sin perder el «Guardado».

field #

propiedad sólo lectura desde 1.5.0

readonly field: <K extends keyof Values & string>(name: K) => FormField<Values[K]>

Las piezas de un campo para cablearlo en un componente propio: su señal, su mensaje, si es inválido, su name y unos id estables entre SSR e hidratación (véase FormField). Devuelve siempre el mismo objeto para el mismo campo.

csrfToken #

propiedad sólo lectura desde 1.7.0

readonly csrfToken: string | undefined

Token CSRF de la sesión para el campo oculto _csrf de un formulario nativo, o undefined sin sesión: en SSR, el de la petición; en el navegador, el de la meta meeko-csrf-token. Un envío con JavaScript no lo necesita, porque lo envía en la cabecera.

Véase también #

¿Te sirvió esta página?

Añadir un comentario

Se envía al elegir «Sí» o «No». Solo se guardan la página, tu respuesta y el comentario: ni cookies ni datos tuyos.

0 de 2000 caracteres

Editar en GitHub: packages/meeko/src/app/composables/useForm.ts