Form

Bien que vous soyez libre d'utiliser les entrées FormKit par elles-mêmes, vous voudrez généralement les regrouper dans un formulaire. Pour ce faire, il suffit d'entourer vos entrées avec un <FormKit type="form">.

Le type form collectera activement toutes les valeurs des entrées enfants, en utilisant le name de chaque entrée comme nom de propriété dans l'objet de données résultant (tout comme les groupes). Vous pouvez également lire et écrire les valeurs du formulaire en utilisant v-model comme vous le feriez sur n'importe quelle entrée.

Un <FormKit type="form"> suit l'état de validation du formulaire et empêche les utilisateurs de soumettre le formulaire si des entrées sont invalides.

Bouton de soumission fourni

Pour plus de commodité, le form génère automatiquement un bouton de soumission button, et les thèmes fournis incluent également un indicateur de chargement. Vous pouvez modifier ce bouton avec les props submit-label et submit-attrs, ou le désactiver avec :actions="false". Vous pouvez passer n'importe quelle prop FormKit à submit-attrs. Dans l'exemple ci-dessous, nous passons des classes, des attributs data, du texte d'aide, et même demander au bouton de soumission inclus d'être pris en compte :

<FormKit
  type="form"
  submit-label="Mettre à jour"
  :submit-attrs="{
    inputClass: 'ma-classe-input',
    wrapperClass: 'ma-classe-wrapper',
    'data-theme': `dark`,
    help: 'Texte d'aide de mon bouton',
    ignore: false
  }"
></FormKit>

Exemple complet de formulaire

Excluant la fonctionnalité backend, voici un formulaire entièrement fonctionnel avec des entrées (form, text, email, password), du texte d'aide, des étiquettes, une validation avec des messages personnalisés, et la gestion des erreurs et des soumissions :

Charger l'exemple en direct

Remplissage

Remplissage et soumission de formulaire - Cours Vue School

8 mins

Vous pouvez remplir un formulaire entier en fournissant une prop value au <FormKit type="form">. La prop value doit être un objet de paires nom d'entrée à valeur d'entrée. Vous pouvez également utiliser v-model pour remplir un formulaire si vous avez besoin d'une liaison de données bidirectionnelle :

Charger l'exemple en direct
v-model et objets réactifs

Assurez-vous de v-model une ref ou une propriété d'un objet reactive. Ne v-model pas l'objet réactif lui-même car cela entraîne un comportement inattendu.

Soumission

Les formulaires sont généralement soumis par des actions de l'utilisateur telles que cliquer sur un bouton de soumission ou appuyer sur la touche entrée dans un champ de texte du formulaire. Lors de la soumission, le formulaire (dans l'ordre) :

  1. Assure que toutes les entrées sont stabilisées (fin de l'attente).
  2. Émet l'événement @submit-raw.
  3. Définit l'état submitted à vrai sur toutes les entrées — affichant toutes les erreurs de validation restantes (indépendamment de la validation-visibility).
  4. Si le formulaire a des erreurs de validation, l'événement @submit-invalid est déclenché.
  5. Si toutes les entrées sont valides, il déclenche l'événement @submit.
  6. Si le gestionnaire @submit retourne une Promise, il définit l'état du formulaire à loading jusqu'à ce qu'elle soit résolue.
Évitez v-model pour collecter et soumettre les données du formulaire

Utiliser des données v-model dans votre gestionnaire de soumission peut entraîner des mutations involontaires du formulaire. FormKit collecte automatiquement les données du formulaire pour vous, utilisez donc la copie non liée des données de votre formulaire qui est passée à votre gestionnaire de soumission à la place.

Soumission via requête XHR/Fetch

La méthode de soumission de formulaire la plus courante dans une SPA moderne est une requête XHR (pensez à axios ou fetch). FormKit est bien adapté à cette tâche :

  • Il fournit à votre gestionnaire @submit 1) les données du formulaire collectées sous forme d'un objet unique prêt pour la requête (pas de v-model nécessaire), et 2) le nœud central de l'entrée form, pour plus de commodité.
  • Si vous utilisez un gestionnaire de soumission asynchrone, il désactivera les entrées de votre formulaire et appliquera un état de chargement à votre formulaire (loading devient vrai dans context.state.loading et un indicateur de chargement est affiché sur le thème genesis).
  • Il gère les erreurs côté serveur en plaçant les messages d'erreur directement sur les entrées en échec.
Charger l'exemple en direct

Soumission en tant que requête de page

Pour soumettre un formulaire via une requête de page, il suffit de ne pas utiliser le gestionnaire @submit. Tout comme en HTML natif, vous pouvez également fournir un attribut action et éventuellement un attribut method.

Charger l'exemple en direct

Soumission de formulaires de manière programmatique

Bien que la soumission d'un formulaire en utilisant n'importe quelle méthode HTML standard soit valide (comme cliquer sur un bouton submit, ou appuyer sur entrée dans un champ de texte) — vous pouvez également soumettre un formulaire de manière programmatique. Il y a 2 façons de faire cela :

  • En utilisant this.$formkit.submit('form-id') (submitForm('form-id') pour l'API de composition).
  • En utilisant un objet nœud central.

Soumission avec $formkit.submit()

Charger l'exemple en direct

Soumission avec node.submit()

Vous pouvez également soumettre un formulaire de manière programmatique en appelant node.submit() sur le nœud principal du formulaire (ou de n'importe quelle entrée à l'intérieur du formulaire). Pour ce faire, vous devez récupérer une instance du nœud principal.

Charger l'exemple en direct

Désactivation

Pour désactiver toutes les entrées dans un formulaire donné, y compris le bouton de soumission, vous pouvez utiliser la propriété disabled.

Charger l'exemple en direct
Désactivation automatique

Lorsque vous utilisez un gestionnaire @submit asynchrone, FormKit désactivera automatiquement le formulaire (et définira l'état sur loading) pendant que le gestionnaire de soumission est en attente.

Réinitialisation

Vous pouvez réinitialiser votre formulaire (ou n'importe quelle entrée) à son état initial en appelant $formkit.reset(formId).

Charger l'exemple en direct
API de composition

Lorsque vous utilisez l'API de composition, vous pouvez accéder directement à la fonction de réinitialisation en l'important depuis le cœur : import { reset } from '@formkit/core'.

Valeurs initiales

Il est important de noter que l'"état initial" d'un formulaire n'est pas nécessairement un formulaire vide. Si vous avez une valeur par défaut :value ou v-model sur le formulaire ou sur des entrées individuelles dans le formulaire, FormKit fusionne automatiquement ces valeurs pour produire votre valeur initiale, et restaurera cet état fusionné lors de la réinitialisation.

Facultativement, vous pouvez fournir un second argument à reset(formId, initialState) si vous préférez un état de réinitialisation alternatif.

Validation

Les formulaires ne seront pas soumis tant que toutes les entrées du formulaire ne passent pas leurs règles de validation.

Message de validation incomplète

En plus de ne pas déclencher l'événement de soumission, un message est affiché au-dessus du bouton de soumission indiquant que le formulaire est encore incomplet. Vous pouvez personnaliser ce message en utilisant la propriété incomplete-message ou le désactiver en définissant la propriété sur false.

Charger l'exemple en direct
Personnalisation globale

Si vous souhaitez modifier le message d'incomplétude pour tous les formulaires de votre projet, vous pouvez modifier le message de localisation i18n pour ui.incomplete.

Soumettre un événement invalide

Lorsqu'un utilisateur tente de soumettre un formulaire contenant des entrées qui ne passent pas les validations, l'événement @submit-invalid est déclenché.

Par exemple, nous pourrions utiliser cet événement pour alerter nos utilisateurs des règles de validation échouées.

Charger l'exemple en direct

État de validité

La validité de toutes les entrées dans un formulaire est automatiquement suivie dans l'objet contexte. Cela peut être utile lors de la création de diverses interfaces. Par exemple, si vous vouliez qu'un bouton de soumission soit désactivé jusqu'à ce que toutes les entrées soient valides, vous pourriez utiliser la propriété state.valid pour ce faire.

Charger l'exemple en direct
Obtenir l'objet contexte

Dans l'exemple ci-dessus, nous extrayons l'objet contexte du slot #default, mais il existe d'autres moyens également. L'objet contexte est disponible sur le nœud central de chaque entrée sur la propriété node.context, et vous pouvez récupérer le nœud d'une entrée de plusieurs manières.

Gestion des erreurs

Avec FormKit, ajouter une validation côté client à votre formulaire est facile — mais qu'en est-il des erreurs produites par votre framework backend, ou celles que vous souhaitez attribuer manuellement ? Il existe deux types d'erreurs que vous pouvez attribuer à un formulaire :

  • Erreurs de formulaire. Elles sont affichées en bas du formulaire au-dessus du bouton de soumission. Un exemple serait un message global comme "Désolé, notre serveur ne fonctionne pas correctement en ce moment".
  • Erreurs d'entrée. Erreurs à placer sur des entrées spécifiques dans votre formulaire, généralement ce sont des erreurs de validation de votre backend, comme "Désolé, ce nom d'utilisateur est déjà pris".

Erreurs de formulaire

Les erreurs de formulaire (celles qui s'appliquent à l'ensemble du formulaire) peuvent être définies de trois manières.

  • En utilisant la propriété errors sur un <FormKit type="form">.
  • En utilisant un nœud central node.setErrors().
  • En utilisant la méthode du plugin Vue $formkit.setErrors().

Utiliser la propriété errors

Comme avec n'importe quelle entrée FormKit, vous pouvez directement attribuer des erreurs en utilisant la propriété errors. Ces erreurs sont toujours visibles (non soumises à validation-visibility).

Charger l'exemple en direct

Utiliser node.setErrors()

Définir les erreurs de votre formulaire en utilisant node.setErrors est pratique puisque votre gestionnaire de soumission reçoit l'objet node du formulaire comme deuxième argument. node.setErrors() prend 2 arguments — un tableau pour les erreurs de formulaire et un objet clé pour les erreurs d'entrée :

Charger l'exemple en direct

Utilisation de $formkit.setErrors()

Alternativement, vous pouvez définir des erreurs directement sur un formulaire en lui attribuant un id puis en appelant $formkit.setErrors('id', ['Erreur du formulaire ici']). La méthode setErrors doit recevoir l'id du formulaire, et peut ensuite gérer 1 ou 2 arguments supplémentaires — les erreurs du formulaire et les erreurs des champs :

Charger l'exemple en direct

Effacer les erreurs

Par défaut, les erreurs qui ont été définies sur les champs en utilisant setErrors() sont automatiquement effacées lorsque l'utilisateur modifie la valeur de ce champ. Vous pouvez changer ce comportement par défaut en définissant la propriété preserve-errors.

Pour effacer toutes les erreurs du formulaire (indépendamment de la propriété preserve-errors), appelez node.clearErrors().

Charger l'exemple en direct

Si vous préférez conserver les erreurs par défaut, vous pouvez modifier le comportement par défaut en modifiant l'option de configuration preserveErrors. Cela peut être fait globalement ou pour un formulaire unique :

Charger l'exemple en direct
API de Composition

Lorsque vous utilisez l'API de composition de Vue 3, vous pouvez accéder à setErrors et clearErrors en les important directement depuis @formkit/vue.

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

Erreurs de champ

Les erreurs de champ (celles à afficher avec des champs spécifiques dans un formulaire) peuvent être appliquées de trois manières :

  • Manuellement en utilisant la propriété errors sur chaque champ individuel.
  • En utilisant la propriété input-errors sur le formulaire (fonctionne aussi avec les groupes et les listes).
  • En utilisant la méthode du plugin Vue $formkit.setErrors() (voir l'exemple ci-dessus).

Utilisation manuelle de la propriété errors

La manière la plus basique d'afficher des erreurs sur un formulaire est d'utiliser la propriété errors qui est disponible sur chaque champ FormKit.

Charger l'exemple en direct

Utilisation de la propriété input-errors

Vous pouvez également définir de manière pratique des messages d'erreur pour tous les champs de votre formulaire (ou groupe ou liste) en utilisant la propriété input-errors. La propriété accepte un objet d'erreurs, où les clés sont les noms des champs (les adresses de nœuds relatives sont prises en charge) et la valeur est une erreur ou un tableau d'erreurs à appliquer à ce champ.

Charger l'exemple en direct

Validation et résumé des erreurs

Il peut être utile pour l'accessibilité de fournir un résumé des messages de validation et d'erreur en haut de votre formulaire. FormKit fournit un composant <FormKitSummary /> pour rendre ce résumé pour vous.

Ce composant affichera automatiquement tous les messages de validation et d'erreur d'un formulaire avec des liens de saut vers les entrées auxquelles ils s'appliquent. Ces erreurs ne sont affichées qu'après la soumission du formulaire, mais elles sont enveloppées dans une région aria-live pour garantir que les lecteurs d'écran seront notifiés lorsque les erreurs se présentent. De plus, la page défilera automatiquement vers la boîte de résumé et se focalisera sur la première erreur listée.

<FormKitSummary /> n'est pas un composant enregistré globalement — vous devez l'importer :

import { FormKitSummary } from '@formkit/vue'
Charger l'exemple en direct
Déplacer le résumé

Le composant de résumé doit généralement être imbriqué dans le formulaire qu'il résume. Si vous souhaitez déplacer le résumé vers un autre emplacement sur la page, vous pouvez le faire en fournissant le nœud central du formulaire comme propriété node.

Déplacer les messages de validation et d'erreur

Par défaut, les messages de validation et d'erreur d'un formulaire sont placés juste au-dessus de la section des actions du formulaire. Cependant, vous pouvez choisir de les rendre n'importe où sur votre page en utilisant le composant <FormKitMessages />. <FormKitMessages /> n'est pas un composant enregistré globalement — vous devez l'importer :

import { FormKitMessages } from '@formkit/vue'

Il y a deux façons d'utiliser <FormKitMessages /> :

Déplacer les messages automatiquement

Placez un composant <FormKitMessages /> n'importe où à l'intérieur de votre formulaire, et les messages du formulaire seront automatiquement déplacés à cet emplacement :

Charger l'exemple en direct

Déplacer les messages par node

Pour déplacer les messages n'importe où dans le DOM — même en dehors du formulaire — vous pouvez passer le nœud central du formulaire comme propriété à <FormKitMessages />. Dans cet exemple, nous utilisons les messages pour créer une popup de style toast :

Charger l'exemple en direct

Propriétés de FormKitMessages

Le composant <FormKitMessages /> a quelques options de configuration supplémentaires :

PropDéfautDescription
nodehéritéLe nœud central pour lequel rendre les messages. Par défaut, cela est hérité du parent du nœud (s'il existe).
sectionsSchema{}Remplace les sections internes messages et message (même structure par défaut que la section des messages d'autres entrées).
defaultPositionfalsePar défaut, FormKitMessages déplace les messages rendus vers un nouvel emplacement. Si vous souhaitez rendre les messages dans les deux emplacements, mettez cette propriété à true.

Démontage des entrées

Lorsqu'une entrée est démontée d'un formulaire — par exemple en utilisant v-if — sa clé et sa valeur sont retirées des données du formulaire. Cependant, dans certaines circonstances, il peut être préférable de conserver la paire clé/valeur même après que l'entrée a été retirée. Cela peut être accompli en utilisant la prop preserve :

Charger l'exemple en direct

Composables

FormKit fournit quelques composables pour vous aider à accéder aux données et au contexte du formulaire. Ceux-ci sont disponibles à l'importation depuis le package @formkit/vue :

useFormKitContext

Le useFormKitContext est un composable qui retourne l'objet contexte du formulaire sous forme de Ref vue dès qu'il devient disponible. Cela doit être utilisé dans un composant qui est un enfant d'un composant <FormKit> (comme le formulaire). Le premier argument est un chemin de traversée optionnel qui vous permet de naviguer vers n'importe quel nœud dans l'arborescence de votre formulaire. Le deuxième argument est un rappel d'effet optionnel qui sera invoqué chaque fois que le contexte deviendra disponible.

Charger l'exemple en direct

useFormKitContextById

Similaire à useFormKitContext, ce composable trouve tout objet contexte <FormKit> si ce composant s'est vu attribuer un id explicite. Facultativement, vous pouvez fournir un rappel d'effet qui sera invoqué chaque fois que le nœud deviendra disponible.

Charger l'exemple en direct

useFormKitNodeById

Récupère tout nœud FormKit qui a un id explicite. Il retourne un Ref qui se peuplera avec le nœud central dès qu'il sera monté. Facultativement, vous pouvez fournir un rappel d'effet qui sera invoqué chaque fois que le nœud deviendra disponible.

Charger l'exemple en direct
Nœud vs contexte

Le nœud lui-même n'est pas réactif et devrait être utilisé pour des actions impératives comme node.submit(). L'objet contexte est réactif et devrait être utilisé pour lire et réagir à l'état du formulaire.

Props & Attributs

Les formulaires sont techniquement considérés comme des types input — ils partagent donc de nombreuses props universelles que les entrées standard utilisent.

PropTypePar défautDescription
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).
Afficher Universel props
configObject{}Options de configuration à fournir au nœud d'entrée et à tout nœud descendant de cette entrée.
delayNumber20Nombre de millisecondes à attendre avant que la valeur d'une entrée ne soit déclenchée avant que le commit hook ne soit déclenché.
dirtyBehaviorstringtouchedDétermine comment le drapeau "dirty" de cette entrée est défini. Peut être défini sur touched ou comparetouched (par défaut) est plus performant, mais ne détectera pas lorsque le formulaire correspond à nouveau à son état initial.
errorsArray[]Tableau de chaînes à afficher comme messages d'erreur sur ce champ.
helpString''Texte pour le texte d'aide associé à l'entrée.
idStringinput_{n}L'identifiant unique de l'entrée. Fournir un identifiant permet également d'accéder globalement au nœud de l'entrée.
ignoreBooleanfalseEmpêche une entrée d'être incluse dans un parent (groupe, liste, formulaire, etc). Utile lors de l'utilisation d'entrées pour l'interface utilisateur au lieu de valeurs réelles.
indexNumberundefinedPermet d'insérer une entrée à l'index donné si le parent est une liste. Si la valeur de l'entrée est indéfinie, elle hérite de la valeur de cette position d'index. Si elle a une valeur, elle l'insère dans les valeurs de la liste à l'index donné.
labelString''Texte pour l'élément label associé à l'entrée.
nameStringinput_{n}Le nom de l'entrée tel qu'identifié dans l'objet de données. Cela doit être unique au sein d'un groupe de champs.
parentFormKitNodecontextualPar défaut, le parent est un groupe d'enrobage, une liste ou un formulaire — mais cette propriété permet une affectation explicite du nœud parent.
prefix-iconString''Spécifie une icône à placer dans la section prefixIcon.
preservebooleanfalseConserve la valeur de l'entrée sur un groupe parent, une liste ou un formulaire lorsque l'entrée est démontée.
preserve-errorsbooleanfalsePar défaut, les erreurs définies sur les entrées à l'aide de setErrors sont automatiquement effacées lors de l'entrée, en définissant cette propriété sur true, l'erreur est maintenue jusqu'à ce qu'elle soit explicitement effacée.
sections-schemaObject{}Un objet de clés de section et de valeurs partielles de schéma, où chaque partie de schéma est appliquée à la section respective.
suffix-iconString''Spécifie une icône à placer dans la section suffixIcon.
typeStringtextLe type d'entrée à afficher à partir de la bibliothèque.
validationString, Array[]Les règles de validation à appliquer à l'entrée.
validation-visibilityStringblurDétermine quand afficher les règles de validation en échec d'une entrée. Les valeurs valides sont blur, dirty et live.
validation-labelString{label prop}Détermine quelle étiquette utiliser dans les messages d'erreur de validation, par défaut, elle utilise la propriété label si elle est disponible, sinon elle utilise la propriété name.
validation-rulesObject{}Règles de validation personnalisées supplémentaires à rendre disponibles pour la propriété de validation.
valueAnyundefinedInitialise la valeur initiale d'une entrée et/ou de ses enfants. Non réactif. Peut initialiser des groupes entiers (formulaires) et des listes..

Sections

Section-keyDescription
formResponsable du rendu de la balise form et de l'écoute des événements de soumission.
actionsResponsable d'un conteneur en bas du formulaire avec des actions de formulaire comme le bouton de soumission.
submitResponsable d'un bouton de soumission — par défaut un type d'entrée FormKit submit.
Afficher Universel section keys
outerL'élément d'enrobage le plus externe.
wrapperUn enrobage autour de l'étiquette et de l'entrée.
labelL'étiquette de l'entrée.
prefixN'a pas de sortie par défaut, mais permet du contenu directement avant un élément d'entrée.
prefixIconUn élément pour afficher une icône avant la section de préfixe.
innerUn enrobage autour de l'élément d'entrée réel.
suffixN'a pas de sortie par défaut, mais permet du contenu directement après un élément d'entrée.
suffixIconUn élément pour afficher une icône après la section de suffixe.
inputL'élément d'entrée lui-même.
helpL'élément contenant le texte d'aide.
messagesUn enrobage autour de tous les messages.
messageL'élément (ou plusieurs éléments) contenant un message — le plus souvent des messages de validation et d'erreur.

Accessibilité

Toutes les entrées FormKit sont conçues en tenant compte des considérations d'accessibilité suivantes. Aidez-nous à améliorer continuellement l'accessibilité pour tous en signalant les problèmes d'accessibilité ici:

Balises sémantiquesAttributs AriaAccessible au clavierIndicateurs de focusContraste des couleurs avec le thème fourniÉtiquettes accessibles, texte d'aide et erreurs