Form

Embora você possa usar os inputs do FormKit individualmente, geralmente você vai querer agrupá-los em um formulário. Para fazer isso, basta envolver seus inputs em um <FormKit type="form">.

O tipo form irá coletar ativamente todos os valores dos inputs filhos, usando o name de cada input como o nome da propriedade no objeto de dados resultante (assim como em grupos). Você também pode ler e escrever nos valores do formulário usando v-model assim como faria em qualquer input.

Um <FormKit type="form"> rastreia o estado de validação do formulário e impede que os usuários o enviem se algum input estiver inválido.

Botão de envio fornecido

Como uma conveniência, o form gera automaticamente um botão de envio button, e os temas fornecidos também incluem um spinner de carregamento. Você pode alterar este botão com as props submit-label e submit-attrs, ou desativá-lo com :actions="false". Você pode passar qualquer prop do FormKit para submit-attrs. No exemplo abaixo, passamos classes, atributos data, texto de ajuda e até mesmo indicamos ao botão de envio incluído para não ser ignorado:

<FormKit
  type="form"
  submit-label="Atualizar"
  :submit-attrs="{
    inputClass: 'minha-classe-input',
    wrapperClass: 'minha-classe-wrapper',
    'data-theme': `dark`,
    help: 'Texto de ajuda do meu botão',
    ignore: false
  }"
></FormKit>

Exemplo completo de formulário

Excluindo a funcionalidade do backend, aqui está um formulário totalmente funcional com inputs (form, text, email, password), texto de ajuda, etiquetas, validação com mensagens personalizadas e tratamento de erros e envio:

Carregar exemplo ao vivo

Preenchendo

Preenchimento e Envio de Formulário - Curso da Vue School

8 mins

Você pode preencher um formulário inteiro fornecendo uma prop value para o <FormKit type="form">. A prop value deve ser um objeto de pares de nome de input para valor de input. Você também pode usar v-model para preencher um formulário se precisar de vinculação de dados bidirecional:

Carregar exemplo ao vivo
v-model e objetos reativos

Certifique-se de usar v-model em um ref ou em uma propriedade de um objeto reactive. Não use v-model no próprio objeto reativo, pois isso leva a comportamentos inesperados.

Enviando

Formulários geralmente são enviados através de ações do usuário, como clicar em um botão de envio ou pressionar a tecla enter em um campo de texto dentro do formulário. Ao enviar, o formulário (em sequência):

  1. Garante que todas as entradas estejam definidas (terminou o debouncing).
  2. Emite o evento @submit-raw.
  3. Define o estado submitted como verdadeiro em todas as entradas — exibindo quaisquer erros de validação restantes (independentemente da validation-visibility).
  4. Se o formulário tiver erros de validação, o evento @submit-invalid é disparado.
  5. Se todas as entradas forem válidas, ele dispara o evento @submit.
  6. Se o manipulador @submit retornar uma Promise, define o estado do formulário como loading até que ela seja resolvida.
Evite v-model para coletar e enviar dados do formulário

Usar dados v-model no seu manipulador de envio pode levar a mutações indesejadas no formulário. O FormKit coleta automaticamente os dados do formulário para você, então use a cópia não vinculada dos dados do seu formulário que é passada para o seu manipulador de envio em vez disso.

Enviando via requisição XHR/Fetch

O método mais comum de envio de formulário em um SPA moderno é uma requisição XHR (pense em axios ou fetch). O FormKit é bem adequado para essa tarefa:

  • Ele fornece ao seu manipulador @submit 1) os dados do formulário coletados como um único objeto pronto para requisição (sem necessidade de v-model), e 2) o núcleo do input form, como uma conveniência.
  • Se você usar um manipulador de envio assíncrono, ele desativará as entradas do seu formulário e aplicará um estado de carregamento ao seu formulário (loading se torna verdadeiro em context.state.loading e um spinner é exibido no tema genesis).
  • Ele lida com erros de backend colocando mensagens de erro diretamente nas entradas que falharam.
Carregar exemplo ao vivo

Enviando como uma requisição de página

Para enviar um formulário via requisição de página, simplesmente não inclua o manipulador @submit. Assim como no HTML nativo, você também pode fornecer um atributo action e, opcionalmente, um atributo method.

Carregar exemplo ao vivo

Enviando formulários programaticamente

Embora enviar um formulário usando qualquer método padrão de HTML seja válido (como clicar em um botão submit ou pressionar enter em uma entrada de texto) — você também pode enviar um formulário programaticamente. Existem 2 maneiras de fazer isso:

  • Usando this.$formkit.submit('form-id') (submitForm('form-id') para a API de composição).
  • Usando um objeto núcleo do nó.

Enviando com $formkit.submit()

Carregar exemplo ao vivo

Enviando com node.submit()

Você também pode enviar um formulário programaticamente chamando node.submit() no núcleo do formulário (ou em qualquer entrada dentro do formulário). Para fazer isso, você precisa obter uma instância do núcleo do componente.

Carregar exemplo ao vivo

Desativando

Para desativar todas as entradas em um determinado formulário, incluindo o botão de enviar, você pode usar a propriedade disabled.

Carregar exemplo ao vivo
Desativado automaticamente

Ao usar um manipulador @submit assíncrono, o FormKit desativará automaticamente o formulário (e definirá o estado para loading) enquanto o manipulador de envio estiver pendente.

Reiniciando

Você pode reiniciar o seu formulário (ou qualquer entrada) para o seu estado inicial chamando $formkit.reset(formId).

Carregar exemplo ao vivo
API de Composição

Ao usar a API de composição, você pode acessar diretamente a função de reinicialização importando-a do núcleo: import { reset } from '@formkit/core'.

Valores iniciais

É importante notar que o "estado inicial" de um formulário não é necessariamente um formulário vazio. Se você tem um :value padrão ou v-model no formulário ou em entradas individuais no formulário, o FormKit automaticamente os mescla para produzir seu valor inicial e restaurará esse estado mesclado ao reiniciar.

Opcionalmente, você pode fornecer um segundo argumento para reset(formId, initialState) se preferir um estado de reinicialização alternativo.

Validação

Os formulários não serão enviados até que todas as entradas no formulário estejam passando pelas suas regras de validação.

Mensagem de validação incompleta

Além de não disparar o evento de envio, uma mensagem é exibida acima do botão de enviar indicando que o formulário ainda está incompleto. Você pode personalizar esta mensagem usando a propriedade incomplete-message ou desativá-la definindo a propriedade como false.

Carregar exemplo ao vivo
Personalização global

Se você deseja alterar a mensagem de incompleto em todos os formulários do seu projeto, você pode modificar a mensagem de localização i18n para ui.incomplete.

Enviar evento inválido

Quando um usuário tenta enviar um formulário contendo entradas que falharam nas validações, o evento @submit-invalid é disparado.

Por exemplo, poderíamos usar esse evento para alertar nossos usuários sobre as regras de validação que falharam.

Carregar exemplo ao vivo

Estado de validade

A validade de todas as entradas dentro de um formulário é rastreada automaticamente no objeto de contexto. Isso pode ser útil ao criar várias interfaces. Por exemplo, se você quisesse que um botão de envio fosse desabilitado até que todas as entradas sejam válidas, você poderia usar a propriedade state.valid para fazer isso.

Carregar exemplo ao vivo
Obtendo o objeto de contexto

No exemplo acima, extraímos o objeto de contexto do slot #default, mas existem outras maneiras também. O objeto de contexto está disponível no núcleo de cada entrada na propriedade node.context, e você pode obter o núcleo de uma entrada de várias maneiras.

Tratamento de erros

Com o FormKit, adicionar validação de front-end ao seu formulário é fácil — mas e quanto aos erros produzidos pelo seu framework de backend ou aqueles que você deseja atribuir manualmente? Existem dois tipos de erros que você pode atribuir a um formulário:

  • Erros de formulário. Estes são exibidos na parte inferior do formulário acima do botão de envio. Um exemplo seria uma mensagem global como "Desculpe, nosso servidor não está funcionando no momento”.
  • Erros de entrada. Erros a serem colocados em entradas específicas dentro do seu formulário, normalmente são erros de validação do seu backend, como "Desculpe, este nome de usuário já está em uso".

Erros de formulário

Erros de formulário (aqueles que se aplicam a todo o formulário) podem ser definidos de três maneiras.

  • Usando a propriedade errors em um <FormKit type="form">.
  • Usando um núcleo de nó node.setErrors().
  • Usando o método do plugin Vue $formkit.setErrors().

Usando a propriedade errors

Como com qualquer entrada do FormKit, você pode atribuir erros diretamente usando a propriedade errors. Esses erros estão sempre visíveis (não sujeitos a validation-visibility).

Carregar exemplo ao vivo

Usando node.setErrors()

Definir os erros do seu formulário usando node.setErrors é conveniente, pois o manipulador de envio recebe o objeto node do formulário como seu segundo argumento. node.setErrors() aceita 2 argumentos — um array para erros de formulário e um objeto com chaves para erros de entrada:

Carregar exemplo ao vivo

Usando $formkit.setErrors()

Alternativamente, você pode definir erros diretamente em um formulário atribuindo um id a ele e depois chamando $formkit.setErrors('id', ['Erro do formulário aqui']). O método setErrors deve receber o id do formulário e pode lidar com 1 ou 2 argumentos adicionais — os erros do formulário e os erros de entrada:

Carregar exemplo ao vivo

Limpando erros

Por padrão, os erros que foram definidos nas entradas usando setErrors() são automaticamente limpos quando um usuário altera o valor dessa entrada. Você pode alterar esse comportamento padrão definindo a propriedade preserve-errors.

Para limpar todos os erros do formulário (independentemente da propriedade preserve-errors) chame node.clearErrors().

Carregar exemplo ao vivo

Se você preferir preservar os erros por padrão, pode alterar o comportamento padrão modificando a opção de configuração preserveErrors. Isso pode ser feito globalmente ou para um único formulário:

Carregar exemplo ao vivo
API de Composição

Ao usar a API de composição do Vue 3, você pode acessar setErrors e clearErrors importando-os diretamente de @formkit/vue.

import { setErrors, clearErrors } from '@formkit/vue'

Erros de entrada

Erros de entrada (aqueles a serem exibidos com entradas específicas em um formulário) podem ser aplicados de três maneiras:

  • Manualmente usando a propriedade errors em cada entrada individual.
  • Usando a propriedade input-errors no formulário (também funciona com grupos e listas).
  • Usando o método do plugin Vue $formkit.setErrors() (veja exemplo acima).

Manualmente usando a propriedade errors

A maneira mais básica de exibir erros em um formulário é usando a propriedade errors que está disponível em cada entrada FormKit.

Carregar exemplo ao vivo

Usando a propriedade input-errors

Você também pode definir convenientemente mensagens de erro para todas as entradas do seu formulário (ou grupo ou lista) usando a propriedade input-errors. A propriedade aceita um objeto de erros, onde as chaves são nomes de entrada (endereços de nós relativos são suportados) e o valor é um erro ou array de erros a serem aplicados a essa entrada.

Carregar exemplo ao vivo

Validação e resumo de erros

Pode ser útil para acessibilidade fornecer um resumo das mensagens de validação e erros no topo do seu formulário. O FormKit oferece um componente <FormKitSummary /> para renderizar esse resumo para você.

Este componente irá renderizar automaticamente todas as mensagens de validação e erros de um formulário com links de salto para as entradas às quais se aplicam. Esses erros são mostrados apenas após o envio do formulário, mas estão envolvidos em uma região aria-live para garantir que os leitores de tela sejam notificados quando os erros se apresentarem. Além disso, a página irá rolar automaticamente para a caixa de resumo e focar no primeiro erro listado.

<FormKitSummary /> não é um componente registrado globalmente — você deve importá-lo:

import { FormKitSummary } from '@formkit/vue'
Carregar exemplo ao vivo
Movendo o resumo

O componente de resumo deve geralmente estar aninhado no formulário que está resumindo. Se você deseja mover o resumo para um local diferente na página, você pode fazer isso fornecendo o nó central do formulário como a propriedade node.

Movendo mensagens de validação e erros

Por padrão, as mensagens de validação e erros de um formulário são colocadas diretamente acima da seção de ações do formulário. No entanto, você pode optar por renderizá-las em qualquer lugar da sua página usando o componente <FormKitMessages />. <FormKitMessages /> não é um componente registrado globalmente — você deve importá-lo:

import { FormKitMessages } from '@formkit/vue'

Existem duas maneiras de usar <FormKitMessages />:

Mover mensagens automaticamente

Coloque um componente <FormKitMessages /> em qualquer lugar dentro do seu formulário, e as mensagens do formulário serão automaticamente movidas para essa localização:

Carregar exemplo ao vivo

Mover mensagens por node

Para mover mensagens para qualquer lugar no DOM — até mesmo fora do formulário — você pode passar o nó central do formulário como uma propriedade para <FormKitMessages />. Neste exemplo, usamos as mensagens para criar um popup estilo toast:

Carregar exemplo ao vivo

Propriedades do FormKitMessages

O componente <FormKitMessages /> tem algumas opções adicionais de configuração:

PropriedadePadrãoDescrição
nodeherdadoO nó central para renderizar mensagens. Por padrão, isso é herdado do nó pai (se existir).
sectionsSchema{}Substitui as seções internas messages e message (mesma estrutura padrão que a seção de mensagens de outras entradas).
defaultPositionfalsePor padrão, FormKitMessages move as mensagens renderizadas para uma nova localização. Se você gostaria de renderizar as mensagens em ambas as localizações, defina esta propriedade como true.

Desmontando entradas

Quando uma entrada é desmontada de um formulário — por exemplo, ao usar v-if — sua chave e valor são removidos dos dados do formulário. No entanto, em algumas circunstâncias, pode ser preferível manter o par chave/valor mesmo após a entrada ter sido removida. Isso pode ser realizado usando a propriedade preserve:

Carregar exemplo ao vivo

Composables

O FormKit fornece alguns composables para ajudá-lo a acessar os dados e o contexto do formulário. Estes estão disponíveis para importação a partir do pacote @formkit/vue:

useFormKitContext

O useFormKitContext é um composable que retorna o objeto de contexto do formulário como um Ref do vue sempre que ele estiver disponível. Este deve ser usado em um componente que é filho de um componente <FormKit> (como o formulário). O primeiro argumento é um caminho de travessia opcional que permite navegar até qualquer nó dentro da sua árvore de formulário. O segundo argumento é um callback de efeito opcional que será invocado sempre que o contexto estiver disponível.

Carregar exemplo ao vivo

useFormKitContextById

Semelhante ao useFormKitContext, este composable encontra qualquer objeto de contexto <FormKit> se esse componente tiver sido dado um id explícito. Opcionalmente, você pode fornecer um callback de efeito que será invocado sempre que o nó estiver disponível.

Carregar exemplo ao vivo

useFormKitNodeById

Busca qualquer nó FormKit que tenha um id explícito. Ele retorna um Ref que será preenchido com o nó central sempre que ele for montado. Opcionalmente, você pode fornecer um callback de efeito que será invocado sempre que o nó estiver disponível.

Carregar exemplo ao vivo
Nó vs contexto

O próprio nó não é reativo e deve ser usado para ações imperativas como node.submit(). O objeto de contexto é reativo e deve ser usado para ler e reagir ao estado do formulário.

Props & Atributos

Formulários são tecnicamente considerados tipos de input — portanto, eles compartilham muitas das props universais que os inputs padrão usam.

PropTypePadrãoDescrição
disabledBooleanfalseDisables the form submit button and all the inputs in the form.
incomplete-messageString/Boolean{locale}.ui.incompleteThe message that is shown to near the submit button when a user attempts to submit a form, but not all inputs are valid.
submit-attrsObject{}Attributes or props that should be passed to the built-in submit button.
submit-behaviorStringdisabledAsync submit handlers automatically disable the form while pending, you can change this by setting this prop to 'live'.
submit-labelStringSubmitThe label to use on the built-in submit button.
actionsBooleantrueWhether or not to include the actions bar at the bottom of the form (ex. you want to remove the submit button and use your own, set this to false).
Mostrar Universal props
configObject{}Opções de configuração a serem fornecidas para o nó do input e qualquer nó descendente deste input.
delayNumber20Número de milissegundos para debounce do valor do input antes de despachar o commit hook.
dirtyBehaviorstringtouchedDetermina como o indicador "dirty" deste input é definido. Pode ser configurado como touched ou compare - touched (o padrão) é mais performático, mas não detectará quando o formulário corresponder novamente ao seu estado inicial.
errorsArray[]Array de strings para exibir como mensagens de erro neste campo.
helpString''Texto para o texto de ajuda associado ao input.
idStringinput_{n}O ID único do input. Fornecer um ID também permite acesso global ao nó do input.
ignoreBooleanfalseImpede que um input seja incluído em qualquer pai (grupo, lista, formulário etc). Útil ao usar inputs para a interface do usuário em vez de valores reais.
indexNumberundefinedPermite que um input seja inserido no índice fornecido, se o pai for uma lista. Se o valor do input for indefinido, ele herda o valor dessa posição de índice. Se ele tiver um valor, ele o insere nos valores da lista no índice fornecido.
labelString''Texto para o elemento label associado ao input.
nameStringinput_{n}O nome do input como identificado no objeto de dados. Isso deve ser único dentro de um grupo de campos.
parentFormKitNodecontextualPor padrão, o pai é um grupo, lista ou formulário de envolvimento, mas essa prop permite a atribuição explícita do nó pai.
prefix-iconString''Especifica um ícone para colocar na seção prefixIcon.
preservebooleanfalsePreserva o valor do input em um grupo pai, lista ou formulário quando o input é desmontado.
preserve-errorsbooleanfalsePor padrão, os erros definidos em inputs usando setErrors são automaticamente limpos no input. Definir essa prop como true mantém o erro até que ele seja explicitamente limpo.
sections-schemaObject{}Um objeto de chaves de seção e valores parciais de esquema, em que cada esquema parcial é aplicado à seção respectiva.
suffix-iconString''Especifica um ícone para colocar na seção suffixIcon.
typeStringtextO tipo de input a ser renderizado pela biblioteca.
validationString, Array[]As regras de validação a serem aplicadas ao input.
validation-visibilityStringblurDetermina quando mostrar as regras de validação com falha de um input. Os valores válidos são blur, dirty e live.
validation-labelString{label prop}Determina qual rótulo usar nas mensagens de erro de validação, por padrão, usa a propriedade label, se disponível, caso contrário, usa a propriedade name.
validation-rulesObject{}Regras de validação personalizadas adicionais para disponibilizar na propriedade de validação.
valueAnyundefinedInicializa o valor do input e/ou de seus filhos. Não é reativo. Pode inicializar grupos inteiros (formulários) e listas..

Seções

Section-keyDescrição
formResponsável por renderizar a tag form e ouvir eventos de envio.
actionsResponsável por um contêiner na parte inferior do formulário com ações do formulário como o botão de envio.
submitResponsável por um botão de envio — por padrão um tipo de entrada FormKit submit.
Mostrar Universal section keys
outerO elemento de envolvimento mais externo.
wrapperUm invólucro ao redor do rótulo e do input.
labelO rótulo do input.
prefixPor padrão, não gera saída, mas permite conteúdo diretamente antes de um elemento input.
prefixIconUm elemento para gerar um ícone antes da seção de prefixo.
innerUm invólucro ao redor do próprio elemento input.
suffixPor padrão, não gera saída, mas permite conteúdo diretamente após um elemento input.
suffixIconUm elemento para gerar um ícone após a seção de sufixo.
inputO próprio elemento input.
helpO elemento que contém o texto de ajuda.
messagesUm invólucro ao redor de todas as mensagens.
messageO elemento (ou muitos elementos) que contém uma mensagem - na maioria das vezes mensagens de validação e erros.

Acessibilidade

Todos os inputs do FormKit são projetados levando em consideração as seguintes considerações de acessibilidade. Ajude-nos a melhorar continuamente a acessibilidade para todos, relatando problemas de acessibilidade aqui:

Marcação semânticaAtributos AriaAcessível por tecladoIndicadores de focoContraste de cores com o tema fornecidoEtiquetas acessíveis, texto de ajuda e erros