Entrées

Introduction

Les entrées FormKit sont similaires aux entrées HTML mais suralimentées avec des fonctionnalités très nécessaires comme les labels, le texte d'aide, la validation, et les messages d'erreur (et bien plus encore). De la même manière que la balise <input> de HTML utilise divers attributs type (c'est-à-dire, <input type="text"> vs <input type="checkbox">), FormKit utilise la prop type pour toutes les entrées. En fait, avec FormKit, il n'y a qu'un seul composant que vous devez apprendre :

Charger l'exemple en direct

Les entrées FormKit ne sont pas limitées à ce qui est disponible en HTML "natif". Notre package séparé FormKit Pro offre un accès à des types d'entrée "synthétiques" tels que repeater, autocomplete, mask, rating et plus encore. Bien sûr, vous pouvez aussi écrire vos propres entrées en créant des entrées personnalisées.

Charger l'exemple en direct

L'Entrée de Formulaire

Bien que vous soyez libre d'utiliser les entrées FormKit par elles-mêmes, vous voudrez généralement les grouper dans un formulaire :

<FormKit type="form">
  <!-- ... vos entrées de formulaire -->
</FormKit>

Le type de formulaire offre une multitude de fonctionnalités, notamment la collecte de valeurs, la définition de valeurs initiales, la soumission de formulaires, la gestion des erreurs, les états de chargement, et plus encore.

Définition des valeurs

Il y a 4 façons de définir la valeur d'une entrée :

  • En utilisant la prop value (Note : ne définit que la valeur initiale).
  • En utilisant v-model.
  • En utilisant la méthode node.input() de FormKit.
  • En définissant la valeur d'un composant parent FormKit.

Utilisation de la prop value

Vous pouvez définir la valeur initiale d'une seule entrée ou d'un groupe d'entrées en utilisant la prop value.

Charger l'exemple en direct
warning

La prop value ne doit être utilisée que pour définir la valeur initiale d'une entrée. Elle ne réagira pas aux changements après la création du composant.

Utilisation de v-model

L'utilisation de v-model permet une liaison de données réactive bidirectionnelle avec n'importe quelle entrée FormKit.

Charger l'exemple en direct

Utilisation de node.input()

Au cœur de chaque entrée FormKit se trouve une instance de l'objet node de FormKit, et l'utilisation de la méthode node.input() est le mécanisme le plus efficace pour modifier la valeur de n'importe quelle entrée (en savoir plus sur l'obtention d'une instance de l'objet node).

Charger l'exemple en direct
tip

Les appels à node.input() sont espacés, et donc asynchrones (utilisez la prop delay pour changer la longueur de l'espacement). Vous pouvez await node.input(val) pour déterminer quand l'entrée s'est stabilisée.

Utilisation d'un parent

Les entrées parentes comme list, group et form sont également capables de définir directement les valeurs de leurs enfants. En fait, la valeur d'un parent est simplement la valeur agrégée de ses enfants. Vous pouvez utiliser l'une des méthodes ci-dessus (value prop, v-model, ou node.input()) pour définir la valeur des enfants.

Charger l'exemple en direct

Définition des attributs

Dans presque tous les cas, les attributs définis sur le composant <FormKit> seront transmis à l'élément <input> réel au cœur du composant, plutôt qu'à tout élément DOM d'emballage. Par exemple :

Charger l'exemple en direct

Validation

Nous discutons de la validation en détail sur sa propre page de documentation — mais il suffit de dire que l'ajout de règles de validation aux entrées dans FormKit est aussi facile que d'ajouter la prop validation :

Charger l'exemple en direct
En savoir plus sur les règles de validationLire la documentation

Debouncing

Pour des raisons de performance, toutes les entrées FormKit prennent en charge le debouncing en tant que fonctionnalité de première classe. Alors que la valeur d'une entrée change à chaque frappe (techniquement l'événement input), cette valeur nouvellement mise à jour n'est définie qu'en interne — les règles de validation, les groupes, les listes, les formulaires et (la plupart des) plugins ne sont pas encore "conscients" qu'un changement a été effectué.

En interne, FormKit débounce l'événement input. Lorsque le debounce est "stabilisé", la nouvelle valeur est "validée" et le reste de l'application est alors notifié via l'événement commit du nœud d'entrée. Le délai de debounce par défaut est de 20 millisecondes et peut être ajusté avec la prop delay ou l'option de configuration.

Pour illustrer cela, récupérons la value du group à partir de la prop de slot #default et observons comment elle n'est pas mise à jour avant la fin de notre delay de 1000ms :

Charger l'exemple en direct
Délai de Group & List

La valeur par défaut de la prop delay est de 20 millisecondes. Cependant, les entrées group et list utilisent 0 millisecondes par défaut pour éviter que le délai de debounce ne s'accumule à chaque niveau de profondeur.

Erreurs explicites

Les erreurs de validation ne sont pas la seule façon de définir des erreurs sur une entrée. Vous pouvez également définir explicitement des messages d'erreur sur une entrée en utilisant la prop errors.

Charger l'exemple en direct
Non bloquant

Les erreurs définies explicitement ne sont pas bloquantes, ce qui signifie qu'elles n'empêchent pas le formulaire d'être soumis de la même manière que les erreurs de validation. Vous pouvez en savoir plus sur la gestion des erreurs dans la documentation du formulaire.

Props & attributs

Les entrées FormKit acceptent à la fois des props universels (ceux qui s'appliquent à toutes les entrées FormKit), et des props spécifiques à l'entrée. Le tableau suivant est une liste complète des props disponibles pour toutes les entrées FormKit.

PropTypePar défautDescription
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..

Événements

Les entrées FormKit émettent à la fois des événements universels (ceux qui sont émis par toutes les entrées), et des événements spécifiques à l'entrée. Le tableau suivant est une liste complète des événements émis par toutes les entrées FormKit.

EventPayloadDescription
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.
Événements Vue

Ce qui précède sont des événements Vue émis par @formkit/vue. @formkit/core émet également ses propres événements dans le cadre du cycle de vie des nœuds centraux.

Sections

Les entrées sont composées de morceaux de HTML appelés "sections". Chaque section a une "clé" qui peut être utilisée pour cibler la section à diverses fins, comme :

  • Modifier les classes de la section via les props {section-key}-class="your-class"
  • Remplacer la structure de la section avec des slots: <template #{section-key}>
  • Étendre chaque schéma de section

De nombreuses clés de section sont universellement disponibles tandis que d'autres sont spécifiques à un type d'entrée donné (vous pouvez définir les vôtres pour des entrées personnalisées également). Le tableau suivant est une liste complète de ceux qui sont généralement disponibles dans toutes les entrées :

Section-keyDescription
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.

Restructurer le balisage

Parfois, vous pouvez trouver nécessaire de restructurer le HTML à l'intérieur d'une entrée FormKit, comme ajouter, modifier, déplacer, ou supprimer des sections. Cela peut être fait en exportant l'entrée (en utilisant l'outil CLI), en apportant les modifications souhaitées, puis en utilisant l'entrée modifiée dans votre projet. Lisez le guide sur l'exportation des entrées pour savoir comment faire.

Apprenez à restructurer vos entréesExporter les docs d'entrées

Slots

Les entrées peuvent avoir leur structure remplacée par des slots. Vous pouvez cibler précisément où va le contenu de votre slot avec les clés de section. Les slots sont ensuite passés à l'objet contexte pour être utilisés dans leur template.

Par exemple, si nous voulions utiliser un slot pour définir le label d'une entrée, nous pourrions utiliser un slot label pour le faire :

Charger l'exemple en direct
Considérez le schéma de section

Un inconvénient de l'utilisation des slots est que vous devez souvent recréer des fonctionnalités non liées pour effectuer le changement que vous désirez. Par exemple, l'utilisation de slots vous obligerait à réimplémenter toutes les classes appliquées à ces sections (ce qui peut être fait en utilisant context.classes.sectionName).

Pour aider à résoudre ce problème, FormKit est également capable de remplacer/s'étendre sélectivement le schéma sous-jacent de chaque section permettant une modification structurelle complexe souvent sans perte de fonctionnalité.

Schéma des sections

FormKit fournit un mécanisme supplémentaire pour modifier la structure d'une entrée FormKit appelée "schéma des sections". Sous le capot, toutes les entrées FormKit sont alimentées par le schéma de FormKit — un format de données compatible JSON pour créer et stocker la structure DOM et la logique. Cela permet une flexibilité structurelle énorme car toutes les entrées peuvent avoir des parties de leur schéma étendues via des clés de section sans remplacement en gros du modèle.

Changer les balises HTML

Par exemple, par défaut, FormKit utilise une liste non ordonnée (<ul> et <li>) pour afficher les messages de validation — mais peut-être avez-vous besoin d'utiliser des balises <div>. Vous pouvez changer ces balises en utilisant la propriété schema sans avoir à recréer aucune fonctionnalité :

Charger l'exemple en direct

Déballer ou supprimer les balises HTML

Pour l'accessibilité et la flexibilité, FormKit utilise plusieurs éléments d'enveloppe comme ceux dans les sections wrapper et inner. Cependant, peut-être que sur certaines entrées, vous devez supprimer un élément d'enveloppe pour vous assurer que d'autres éléments sont adjacents. Vous pouvez le faire en fournissant une valeur null comme élément de schéma :

Charger l'exemple en direct

Logique du schéma

Les schémas de section peuvent également changer le contenu qui est affiché en utilisant une logique de schéma avancée. Vous pourriez, par exemple, afficher une valeur spéciale lorsque la valeur de votre entrée correspond à une chaîne particulière :

Charger l'exemple en direct

En savoir plus sur le schéma