Votre premier formulaire

Introduction

Commençons par créer notre premier formulaire FormKit ! Nous découvrirons certaines des principales fonctionnalités de FormKit et comment elles vous sont bénéfiques. Nous apprendrons également quelques astuces en cours de route, comme la gestion de l'état du formulaire sans utiliser v-model.

Composition API

Ce guide suppose que vous êtes familiarisé avec la Vue Composition API.

Formulaires robustes avec Vue.js - Cours Vue School

1 h, 49 mins

Notre première entrée

L'une des principales caractéristiques de FormKit est son API à composant unique — le composant <FormKit />. Ce seul composant vous donne accès à tous les types d'entrée. Et bien que certains types puissent s'étendre et ajouter des fonctionnalités, ils partagent la même fonctionnalité de base. Vous pouvez en savoir plus sur les entrées ici.

Même sans aucune prop, le composant <FormKit /> a déjà donné à notre entrée un excellent point de départ, avec un balisage accessible, un type d'entrée text de base, et des fonctionnalités supplémentaires qui seront expliquées dans les sections suivantes.

Props de base

Le type

Par défaut, le composant <FormKit /> utilisera type="text" si aucun type n'est spécifié. Le type est la façon dont nous spécifions l'entrée que nous voulons. Tout comme les entrées natives, nous avons des entrées comme text, select, checkbox et ainsi de suite. Cependant, nous ne sommes pas limités aux seules entrées "natives", FormKit Pro ajoute des contrôles non natifs comme les types repeater, taglist, et autocomplete, qui peuvent gérer des interactions plus complexes.

Charger l'exemple en direct

Le nom et l'id

Si vous regardez le HTML généré par l'exemple précédent, vous verrez que FormKit a déjà créé un balisage accessible. Cependant, comme nous n'avons pas spécifié les propriétés name et id, elles ont été générées automatiquement pour nous : name: "text_1" id="input_0". Même ainsi, en tant que meilleure pratique, nous devrions toujours au moins spécifier le name car cela facilite l'utilisation des entrées à l'intérieur d'un formulaire. Le name est utilisé par les types form et group pour collecter les valeurs de, et transmettre les valeurs à, leurs enfants en fonction du name :

Charger l'exemple en direct

Props pour l'accessibilité

Il manque encore à notre entrée certaines fonctionnalités d'accessibilité clés comme une label, help, et peut-être même un placeholder. FormKit accepte tout cela comme props, et produit les attributs aria appropriés. Les lecteurs d'écran annonceront maintenant le nom de l'entrée, le texte d'aide, et que l'entrée est prête à être éditée :

Charger l'exemple en direct

Définir une valeur initiale

Parfois, vous voulez ajouter une valeur initiale à une entrée, comme fournir un point de départ sensé, ou remplir des données pré-enregistrées à partir d'une base de données. Nous faisons cela avec la prop value.

Commençons à construire un exemple que nous pourrons ajouter à ce guide. Imaginons que nous construisons un "formulaire de création de personnage" pour un jeu. Assignons à notre personnage une note de force. Nous pourrions utiliser l'entrée range avec une valeur prédéfinie de 5 lorsque l'utilisateur ouvre le formulaire pour la première fois :

Charger l'exemple en direct

Ajout d'une validation

La validation est l'une des principales fonctionnalités de FormKit. Elle aide l'utilisateur à savoir si la valeur qu'il soumet est correcte. Ajouter une validation est un jeu d'enfant, avec de nombreuses règles de validation puissantes déjà implémentées pour vous. Nous utiliserons la prop validation pour nous assurer que le personnage n'est pas trop fort ou trop faible. La prop validation-visibility nous permet de contrôler quand montrer les messages de validation à l'utilisateur - immédiatement, lorsque l'utilisateur sort de l'entrée, ou lors de la soumission du formulaire. L'état de validité réel est calculé en temps réel et toujours à jour - nous choisissons simplement quand exposer les messages :

Charger l'exemple en direct

Notez que les props min et max ci-dessus sont des props de navigateur intégrées pour une entrée de gamme, et représentent le haut et le bas du curseur de gamme.

Ajout d'un plugin

Supposons que notre "backend" nécessite que des données comme strength soient castées en nombre. Par défaut, FormKit suit le comportement des entrées "natives" HTML, rendant toutes les valeurs comme des "chaînes". Pour corriger cela, nous pouvons utiliser l'une des fonctionnalités les plus cool de FormKit - les plugins - qui peuvent être considérés comme des intergiciels pour les entrées. Avec un plugin, qui sont juste des fonctions, nous pouvons changer comment la valeur de notre entrée est retournée :

Charger l'exemple en direct

Création du formulaire

Tout d'abord, créons un formulaire de base et ajoutons plus d'entrées pour avoir du contenu avec lequel travailler. Nous ajouterons plus de fonctionnalités à chaque section, comme la validation, le regroupement et la modification des valeurs en fonction d'autres entrées.

Nous utiliserons l'une des entrées appelée form, qui facilitera le regroupement et la validation des champs. Vous avez juste besoin d'envelopper toutes vos entrées dans un <FormKit type="form"> :

Valeurs du formulaire

Le type form collectera activement toutes les valeurs des entrées enfants en utilisant le name de chaque entrée comme un objet de données pour vous (tout comme group).

Charger l'exemple en direct

Ajout du gestionnaire de soumission

La première fonctionnalité d'un formulaire que nous allons explorer est que nous avons un événement @submit prêt à nous faciliter la vie lorsque vient le moment de soumettre notre formulaire. L'événement @submit nous donne comme premier argument tous les champs descendants que le formulaire a recueillis à partir des entrées. Il n'est pas nécessaire d'utiliser de nombreux v-models pour collecter les données du formulaire. Ajoutons notre gestionnaire de soumission createCharacter() :

Charger l'exemple en direct

Modification du bouton de soumission

Pour plus de commodité lors de l'utilisation de type="form", le form génère automatiquement un bouton de soumission. Dans notre cas, un texte "Submit" ne montre pas correctement l'intention du formulaire. Pour corriger cela, nous pouvons utiliser la propriété submit-label, qui est une fonctionnalité spécifique à form, simplement en ajoutant submit-label="Create Character" pour montrer l'intention du formulaire :

<FormKit type="form" @submit="createCharacter" submit-label="Créer un personnage">
  <!-- Reste de notre formulaire de création -->
</FormKit>

Regroupement des entrées liées

Bien que le formulaire fonctionne actuellement, nous pouvons voir que certaines entrées liées sont séparées (c'est-à-dire que les données du formulaire sont une structure plate où toutes les données du formulaire sont des frères). Supposons que notre backend a besoin de toutes les attributs à l'intérieur d'une propriété attributes. Nous pouvons utiliser le type group pour regrouper les entrées liées ensemble par un name commun.

Tout comme le type form, vous pouvez envelopper tous vos champs dans un <FormKit type="group" name: "attributes">. N'oubliez pas d'ajouter la propriété name :

Charger l'exemple en direct

Aller plus loin

Et c'est tout ! Nous pourrions nous arrêter ici pour une introduction sur la façon dont les formulaires et les entrées fonctionnent avec FormKit. Cependant, ajoutons quelques améliorations UX et utilisons cela pour nous exposer à des concepts et des fonctionnalités supplémentaires que vous pouvez utiliser pour amener vos formulaires au niveau supérieur.

Mise à jour des valeurs en fonction d'une autre entrée

Une chose que nous pouvons faire pour améliorer ce formulaire est de changer les attributs par défaut du personnage en fonction de la classe de personnage sélectionnée. Pour cela, nous allons utiliser quelques nouvelles fonctionnalités :

  • getNode : getNode obtient le nœud central d'une entrée en utilisant son id comme identifiant. Chaque entrée a un nœud central associé.
  • events : events écoute les modifications d'une certaine entrée.
  • node.input() : la fonction input sur un nœud nous permet de mettre à jour sa valeur.

Avec ces fonctionnalités combinées, nous pouvons obtenir le nœud central d'une entrée, écouter et répondre aux événements, et mettre à jour une valeur d'un autre champ en utilisant la fonction input :

Charger l'exemple en direct

Transformez-le en un plugin

Le code est maintenant un peu moins lisible, alors extrayons la logique dans un autre fichier pour créer un plugin à la place. Notez que nous plaçons le nouveau updateAttributesPlugin uniquement sur l'entrée class, donc il n'affectera aucune autre entrée. Nous allons également apprendre une autre fonctionnalité utile appelée traversal en utilisant la fonction at d'un nœud :

at() utilise name

La fonction at utilise l'attribut name au lieu de l'id que getNode utilise.

Charger l'exemple en direct

Ajout de la validation de groupe

Supposons que, bien que différents personnages soient meilleurs dans différents attributs, aucun ne devrait être trop puissant. Nous pouvons faire cela en créant un budget de points, et en ajoutant une validation de groupe aux attributs group pour s'assurer qu'ils ne dépassent pas 20 points au total. Nous allons apprendre une nouvelle fonctionnalité - règles personnalisées - pour accomplir cela :

Les groupes n'affichent pas de messages par défaut

Par défaut, le type group ne produit aucune balise, donc pour montrer les erreurs de validation, nous devons l'ajouter manuellement.

Charger l'exemple en direct

Rendu conditionnel

Parfois, les formulaires doivent afficher ou masquer des champs en fonction de la valeur d'une autre entrée. Nous pouvons le faire en apprenant 2 nouveaux concepts :

  • Objet de contexte — Nous pouvons accéder à la valeur d'une entrée (ainsi qu'à d'autres données) à l'intérieur de notre formulaire car tous les composants FormKit reçoivent leur objet de contexte dans le #default slot prop.
  • La valeur d'un group - La valeur d'un group (et form) input est un objet avec les valeurs de ses enfants, clés par les names des enfants.
Propriété clé de Vue

Lors de l'utilisation du rendu conditionnel, notez que Vue a besoin d'indices pour savoir qu'un élément DOM nécessite un nouveau rendu, au lieu d'essayer de le réutiliser. Nous pouvons ajouter une propriété key unique à l'élément pour aider Vue.

Alors, prenons l'objet de contexte de l'entrée group et extrayons la value: #default="{ value }". Nous voulons ajouter un petit easter egg pour nos utilisateurs s'ils décident de changer tous les attributs à 1 :

Charger l'exemple en direct

Prochaines étapes

Et cela conclut notre introduction à FormKit ! Vous êtes maintenant prêt à commencer à l'utiliser !

Il y a quelques sujets que nous vous recommandons d'explorer ensuite, que vous pouvez lire dans n'importe quel ordre ou même plus tard après avoir essayé FormKit par vous-même :

  • Stylez vos formulaires : Apprenez comment ajouter des classes à FormKit en utilisant sections, ou même utiliser Tailwind CSS avec l'aide de notre guide.
  • Formulaires multilingues : Apprenez comment FormKit facilite l'i18n avec des dizaines de langues disponibles. Ou vous pouvez ajouter la vôtre !
  • Explorez le schéma de FormKit : Apprenez à propos du schéma compatible JSON de FormKit et comment vous pouvez l'utiliser pour la génération de formulaires, la sauvegarde de formulaires dans une base de données au format JSON, ou la construction de votre propre générateur de formulaires.