Entradas

Introdução

As Entradas do FormKit são semelhantes às entradas HTML, mas turbinadas com recursos muito necessários, como rótulos, texto de ajuda, validação e mensagens de erro (e muito mais). Semelhante a como a tag <input> do HTML usa vários atributos type (ou seja, <input type="text"> vs <input type="checkbox">), o FormKit usa a prop type para todas as entradas. Na verdade, com o FormKit, existe apenas 1 componente que você precisa aprender:

Carregar exemplo ao vivo

As Entradas do FormKit não estão limitadas ao que está disponível no HTML "nativo". Nosso pacote separado FormKit Pro fornece acesso a tipos de entrada "sintéticos", como repeater, autocomplete, mask, rating e mais. Claro, você também pode escrever suas próprias entradas criando entradas personalizadas.

Carregar exemplo ao vivo

A Entrada do Formulário

Embora você esteja livre para usar as entradas do FormKit por si só, geralmente você vai querer agrupá-las em um formulário:

<FormKit type="form">
  <!-- ... suas entradas de formulário -->
</FormKit>

O tipo de formulário fornece uma série de recursos, incluindo coleta de valores, definição de valor inicial, envio de formulário, tratamento de erros, estados de carregamento e mais.

Definindo valores

Existem 4 maneiras de definir o valor de uma entrada:

  • Usando a prop value (Nota: define apenas o valor inicial).
  • Usando v-model.
  • Usando o método node.input() do FormKit.
  • Definindo o valor de um componente FormKit pai.

Usando a prop value

Você pode definir o valor inicial de uma única entrada ou de um grupo de entradas usando a prop value.

Carregar exemplo ao vivo
warning

A prop value deve ser usada apenas para definir o valor inicial de uma entrada. Ela não reagirá a mudanças após o componente ter sido criado.

Usando v-model

Usar v-model permite a vinculação de dados reativos bidirecionais com qualquer entrada do FormKit.

Carregar exemplo ao vivo

Usando node.input()

No coração de cada entrada do FormKit está uma instância do objeto node do FormKit, e usar o método node.input() é o mecanismo mais eficiente para modificar o valor de qualquer entrada (leia mais sobre obter uma instância do objeto node).

Carregar exemplo ao vivo
tip

As chamadas para node.input() são amortecidas e, portanto, assíncronas (use a prop delay para alterar o comprimento da amortização). Você pode await node.input(val) para determinar quando a entrada foi estabilizada.

Usando um pai

Entradas parentais como list, group e form também são capazes de definir diretamente os valores de qualquer um de seus filhos. Na verdade, o valor de um pai é apenas o valor agregado de seus filhos. Você pode usar qualquer um dos métodos acima (value prop, v-model, ou node.input()) para definir o valor dos filhos.

Carregar exemplo ao vivo

Definindo atributos

Em quase todos os casos, os atributos definidos no componente <FormKit> serão passados para o elemento <input> real no coração do componente, em vez de quaisquer elementos DOM de embrulho. Por exemplo:

Carregar exemplo ao vivo

Validação

Discutimos a validação em mais detalhes em sua própria página de documentação — mas basta dizer que adicionar regras de validação às entradas no FormKit é tão fácil quanto adicionar a prop validation:

Carregar exemplo ao vivo
Saiba mais sobre regras de validaçãoLeia a documentação

Debouncing

Para desempenho, todas as entradas do FormKit suportam debouncing como um recurso de primeira classe. Enquanto o valor de uma entrada muda a cada tecla pressionada (tecnicamente o evento input), este valor atualizado recentemente é apenas definido internamente — regras de validação, grupos, listas, formulários e (a maioria) plugins ainda não estão “cientes” de que uma mudança foi feita.

Internamente, o FormKit debounces o evento input. Quando o debounce "se acalma", o novo valor é “comprometido” e o resto do aplicativo é então notificado através do evento commit do nó de entrada. O atraso padrão do debounce é de 20 milissegundos e pode ser ajustado com a prop delay ou opção de configuração.

Para ilustrar isso, vamos pegar o value do group a partir da prop do slot #default e observar como ele não é atualizado até depois do nosso delay de 1000ms:

Carregar exemplo ao vivo
Atraso do Group & List

O padrão da prop delay é 20 milissegundos. No entanto, as entradas group e list usam 0 milissegundos por padrão para evitar que o atraso do debounce se “acumule” em cada nível de profundidade.

Erros explícitos

Os erros de validação não são a única maneira de definir erros em uma entrada. Você também pode definir explicitamente mensagens de erro em uma entrada usando a prop errors.

Carregar exemplo ao vivo
Não bloqueante

Os erros definidos explicitamente são não bloqueantes, o que significa que eles não impedem o formulário de ser enviado da maneira que os erros de validação fazem. Você pode ler mais sobre o tratamento de erros na documentação do formulário.

Props & atributos

Os inputs do FormKit aceitam tanto props universais (aqueles que se aplicam a todos os inputs do FormKit), quanto props específicos do input. A tabela a seguir é uma lista completa de props disponíveis para todos os inputs do FormKit.

PropTypePadrãoDescrição
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..

Eventos

Os inputs do FormKit emitem tanto eventos universais (aqueles que são emitidos de todos os inputs), quanto eventos específicos do input. A tabela a seguir é uma lista completa de eventos emitidos por todos os inputs do FormKit.

EventPayloadDescrição
inputanyEmitted when the core node’s commit hook is completed. Has it’s own debounce to reduce noise. Includes the core node as the second argument.
input-rawanyEmitted on every core node’s commit hook. Includes the core node as the second argument.
nodeFormKitNodeEmitted when the component’s setup is complete. This is the internal FormKitNode object at the heart of the input.
Eventos Vue

Os acima são eventos Vue emitidos por @formkit/vue. @formkit/core também emite seus próprios eventos como parte do ciclo de vida de nós centrais.

Seções

Os inputs são compostos por pedaços de HTML chamados "seções". Cada seção tem uma "chave" que pode ser usada para direcionar a seção para uma variedade de propósitos, como:

  • Modificar as classes da seção via props {section-key}-class="your-class"
  • Substituir a estrutura da seção com slots: <template #{section-key}>
  • Estender cada esquema de seção

Muitas chaves de seção estão universalmente disponíveis, enquanto outras são específicas para um determinado tipo de input (você pode definir as suas próprias para inputs personalizados também). A tabela a seguir é uma lista completa daquelas que estão geralmente disponíveis em todos os inputs:

Section-keyDescrição
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.

Reestruturar marcação

Às vezes, você pode achar necessário reestruturar o HTML dentro de um input do FormKit, como adicionar, editar, mover ou remover seções. Isso pode ser feito exportando o input (usando a ferramenta CLI), fazendo as alterações desejadas e, em seguida, usando o input modificado em seu projeto. Leia o guia sobre exportação de inputs para aprender como.

Aprenda a reestruturar seus inputsDocumentação de exportação de inputs

Slots

Os inputs podem ter sua estrutura substituída com slots. Você pode direcionar precisamente onde o conteúdo do seu slot vai com chaves de seção. Os slots são então passados para o objeto de contexto para uso em seu template.

Por exemplo, se quiséssemos usar um slot para definir o rótulo de um input, poderíamos usar um slot label para isso:

Carregar exemplo ao vivo
Considere o esquema de seção

Uma desvantagem de usar slots é que você geralmente precisa recriar recursos não relacionados para fazer a alteração desejada. Por exemplo, usar slots exigiria que você reimplementasse quaisquer classes aplicadas a essas seções (o que pode ser feito usando context.classes.sectionName).

Para ajudar a resolver essa limitação, o FormKit também é capaz de substituir/se estender seletivamente o esquema subjacente de cada seção, permitindo modificação estrutural complexa muitas vezes sem perda de funcionalidade.

Esquema de seções

FormKit fornece um mecanismo adicional para alterar a estrutura de uma entrada FormKit chamada "esquema de seções". Por trás dos panos, todas as entradas FormKit são alimentadas pelo esquema FormKit — um formato de dados compatível com JSON para criar e armazenar estrutura e lógica DOM. Isso permite uma enorme flexibilidade estrutural porque todas as entradas podem ter partes de seu esquema estendidas via chaves de seção sem a substituição total do template.

Alterando tags HTML

Por exemplo, por padrão, FormKit usa uma lista não ordenada (<ul> e <li>) para exibir mensagens de validação — mas talvez você precise usar tags <div>. Você pode alterar essas tags usando a prop schema sem ter que recriar qualquer funcionalidade:

Carregar exemplo ao vivo

Desembrulhando ou removendo tags HTML

Para acessibilidade e flexibilidade, FormKit usa vários elementos de wrapper como os das seções wrapper e inner #sections. No entanto, talvez em algumas entradas você precise remover um elemento de wrapper para garantir que outros elementos estejam adjacentes. Você pode fazer isso fornecendo um valor null como o elemento do esquema:

Carregar exemplo ao vivo

Lógica do esquema

Os esquemas de seção também podem alterar o conteúdo sendo exibido usando lógica de esquema avançada. Você poderia, por exemplo, exibir um valor especial quando o valor de sua entrada corresponde a uma string específica:

Carregar exemplo ao vivo

Saiba mais sobre esquema