Plugin d'entrée multi-étapes

Introduction

FormKit est livré avec un plugin d'entrée multi-étapes de première partie disponible dans le package @formkit/addons. Cette entrée vous permet de construire un assistant ou de diviser facilement vos formulaires en plusieurs étapes. Diviser les formulaires en plusieurs étapes peut améliorer l'expérience utilisateur des formulaires plus grands en les maintenant petits et accessibles par rapport à la liste de toutes les entrées en une seule fois.

Aperçu du composant multi-étapes

2 mins

Installation

Pour commencer, importez createMultiStepPlugin de @formkit/addons ainsi que les styles associés. Les styles sont complètement autonomes et n'ont aucune dépendance sur le thème genesis qui est livré avec FormKit. Cela signifie que si vous utilisez Tailwind pour styliser vos entrées, vos styles d'entrée s'afficheront toujours comme prévu lorsqu'ils sont enveloppés dans le type d'entrée multi-step.

// formkit.config.js
import { defaultConfig } from '@formkit/vue'
import { createMultiStepPlugin } from '@formkit/addons'
import '@formkit/addons/css/multistep'

const config = defaultConfig({
  plugins: [createMultiStepPlugin()],
})

export default config

Une rapide démonstration du type d'entrée multi-step en action :

Charger l'exemple en direct

Utilisation

La fonction createMultiStepPlugin enregistre deux nouveaux types d'entrée que vous pouvez utiliser avec le composant FormKit.

  • multi-step: Le groupe d'enveloppe pour l'ensemble de l'entrée multi-étapes. Cette entrée garde une trace de l'étape active, de la validation et des erreurs par étape, et ne doit contenir que des entrées step en tant qu'enfants immédiats
  • step: Le groupe d'enveloppe pour une étape donnée dans votre entrée multi-étapes. Ne doit être qu'un enfant immédiat d'une entrée multi-step. Ses enfants seront rendus comme le contenu de l'étape.

Utiliser ces entrées ensemble est aussi simple que d'envelopper n'importe quel balisage que vous voulez avoir présent dans une étape d'un formulaire multi-étapes.

<FormKit type="multi-step">
  <FormKit type="step" name="stepOne">
    <!-- le contenu de stepOne va ici ! -->
  </FormKit>
</FormKit>

Par défaut, l'entrée parent multi-step suit la validité des entrées contenues dans chaque entrée step enfant et empêche de passer à l'étape suivante tant que l'étape en cours n'est pas valide. Le nombre total de validations et d'erreurs bloquantes sera affiché à côté du nom de l'étape en cours si un utilisateur tente de passer à l'étape suivante ou de soumettre le formulaire avant de satisfaire les validations d'entrée de l'étape en cours.

Style des onglets

L'entrée multi-step est livrée avec deux styles d'onglets disponibles.

  • tab : L'expérience par défaut des onglets. Chaque nom d'étape est affiché dans un onglet avec un état actif. Le nombre d'erreurs est affiché en haut à droite de l'onglet.
  • progress : Un style de barre de progression où chaque étape est un "nœud" sur une chronologie du nombre total d'étapes. Avec ce mode d'affichage, vous pouvez également utiliser la propriété hide-progress-labels pour masquer les noms des étapes.
Charger l'exemple en direct

Étiquettes des étapes

Par défaut, l'entrée multi-step utilisera l'attribut name de ses entrées step enfants pour générer des étiquettes pour les étapes. Si vous souhaitez avoir plus de contrôle sur l'affichage des noms de vos étapes, vous pouvez utiliser la propriété label. Vous pouvez également personnaliser les étiquettes qui apparaissent dans la section stepActions de votre step en utilisant les propriétés previous-label et next-label.

  • label : Un remplacement pour le nom de l'étape qui doit apparaître dans les onglets multi-étapes.
  • previous-label : un remplacement pour l'étiquette du bouton stepPrevious qui est par défaut Retour.
  • next-label : un remplacement pour l'étiquette du bouton stepNext qui est par défaut Suivant.
Charger l'exemple en direct

Autoriser les étapes incomplètes

Par défaut, l'entrée multi-step permettra de passer à des étapes ultérieures même si l'étape actuelle ou une étape entre l'étape actuelle et l'étape cible a des messages de validation bloquants. Pour empêcher un utilisateur de sauter en avant, définissez la propriété allow-incomplete sur false.

Charger l'exemple en direct

Icône d'étape valide

Lorsqu'une étape a été complétée sans erreurs de validation, l'entrée multi-step affichera — par défaut — une icône de coche indiquant que l'étape est valide et qu'aucune autre action n'est requise. L'valid-step-icon est une Icône FormKit et peut être modifiée via une propriété comme toute autre icône FormKit.

Vous pouvez soit :

  • Changer le valid-step-icon sur l'entrée multi-step pour changer l'icône pour toutes les étapes à l'intérieur de l'entrée.
  • Changer le valid-step-icon sur une entrée step pour changer ou remplacer l'icône uniquement pour cette étape.
Charger l'exemple en direct

Personnalisation des actions d'étape

Chaque step dans une entrée multi-step a des boutons par défaut rendus pour se déplacer entre les étapes. Par défaut, la première step d'un multi-step n'aura qu'un bouton d'action stepNext rendu, et la dernière step n'aura qu'un bouton d'action stepPrevious. Cela permet à un multi-step de fonctionner comme un groupe autonome dans le contexte d'un formulaire plus grand.

Si vous souhaitez ajouter une action personnalisée, comme un envoi de formulaire à un multi-step — utile si vous utilisez le multi-step comme votre formulaire complet — vous pouvez le faire en écrasant l'emplacement stepNext sur l'étape souhaitée. Dans ce cas, nous ajouterons une entrée submit à la dernière étape de notre entrée multi-step pour soumettre le formulaire.

Les sections stepNext et stepPrevious ont accès au gestionnaire incrementStep — qui renvoie une fonction callable — pour permettre la navigation programmatique.

Navigation par onglets

Par défaut, le stepNext dans une entrée multi-step utilise des écouteurs d'événements pour capturer la navigation par onglets via le clavier et permettre aux utilisateurs de parcourir toutes les étapes disponibles dans un multi-step.

Si vous souhaitez conserver ce comportement dans votre propre implémentation stepNext personnalisée, assurez-vous d'ajouter un attribut data-next="true" à votre élément pouvant recevoir le focus qui déclenche la navigation d'étape.

Charger l'exemple en direct

L'événement beforeStepChange

Parfois, vous devez faire quelque chose avec vos données de formulaire entre les étapes. Peut-être que vous voulez soumettre chaque étape indépendamment à votre back-end ou que vous devez enregistrer des événements analytiques pour déterminer jusqu'où les utilisateurs parviennent à travers votre formulaire. Dans des cas comme ceux-ci, vous pouvez utiliser l'événement beforeStepChange. beforeStepChange accepte une fonction et se voit attribuer un objet contexte avec les clés suivantes :

  • currentStep : L'objet contexte du nœud d'étape actuellement actif dont l'utilisateur s'éloigne.
  • targetStep : L'objet contexte du nœud d'étape vers lequel l'utilisateur se dirige.
  • delta : La distance entre les étapes. Les entiers positifs représentent l'avancement, les entiers négatifs représentent le recul.

Votre fonction beforeStepChange doit renvoyer un Boolean. Renvoyer false empêchera le changement d'étape de se produire.

beforeStepChange peut être utilisé sur votre entrée multi-step, auquel cas il s'appliquera à toutes les étapes. De plus, vous pouvez utiliser beforeStepChange sur une entrée step spécifique pour exécuter votre fonction uniquement lors de la navigation à partir de l'étape à laquelle la fonction est attribuée. beforeStepChange appliqué à une step remplacera tout beforeStepChange défini sur un multi-step parent s'il en existe un.

Charger l'exemple en direct

Props & Attributs (multi-step)

PropTypePar défautDescription
allowIncompletebooleantrueLorsque true, permet aux utilisateurs de naviguer entre les étapes même si l'étape actuelle est invalide.
tabStylestringtabUtilisé pour définir un attribut de données pour créer des styles d'onglets. Le thème par défaut est livré avec le support des styles d'onglets tab et progress.
hideProgressLabelsbooleanfalseLorsque true, masque les étiquettes pour le style d'onglet progress.
validStepIconstringcheckSpécifie une icône à placer dans la section badge lorsqu'une étape est valide. Lorsqu'elle est appliquée au multi-step, l'icône sera appliquée à toutes les entrées d'étape enfants.
beforeStepChangefunctionundefinedUne fonction à exécuter avant que l'étape active ne soit modifiée. La fonction est fournie avec un objet de contexte contenant currentStep et targetStep qui sont tous deux des objets de contexte FormKit node. De plus, delta est fourni sous la forme d'un entier qui reflète la distance entre currentStep et targetStep. Lorsqu'elle est fournie au multi-step, cette fonction se déclenchera à chaque changement d'étape.
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 compare — touched (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..

Props & Attributs (étape)

PropTypePar défautDescription
labelstringUtilisé pour modifier l'étiquette de l'onglet de l'étape. Si aucune étiquette personnalisée n'est fournie, le name de l'étape sera utilisé.
previousLabelstringPrécédentUtilisé pour modifier l'étiquette du bouton previousAction par défaut.
nextLabelstringSuivantUtilisé pour modifier l'étiquette du bouton nextAction par défaut.
previousAttrsobject[object Object]Utilisé pour appliquer des attributs au bouton d'entrée previousAction par défaut.
nextAttrsobject[object Object]Utilisé pour appliquer des attributs au bouton d'entrée nextAction par défaut.
validStepIconstringcheckSpécifie une icône à placer dans la section badge lorsque l'étape est valide. Lorsqu'elle est appliquée à une étape, l'icône ne sera appliquée qu'à l'étape cible.
beforeStepChangefunctionundefinedUne fonction à exécuter avant que l'étape active ne soit modifiée. La fonction est fournie avec un objet de contexte contenant currentStep et targetStep qui sont tous deux des objets de contexte FormKit node. De plus, delta est fourni sous la forme d'un entier qui reflète la distance entre currentStep et targetStep. Lorsqu'elle est fournie à une étape, cette fonction ne se déclenchera que lors de la navigation à partir de l'étape spécifiée.
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 compare — touched (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

Nom de l'étape
⚠️
... Contenu de l'étape ...
Retour
Suivant
Section-keyDescription
tabsUn conteneur autour de tous les onglets.
tabUn élément bouton qui contient le nom de l'onglet et le décorateur pour refléter l'état de validation.
tabLabelUn élément span qui contient le nom de l'onglet.
badgeUn élément span utilisé comme décorateur pour montrer l'état de validité de l'onglet actuel.
stepsUn conteneur autour de toutes les étapes.
stepUn conteneur autour du contenu de l'étape à partir de l'emplacement par défaut et des boutons d'action de l'étape. Chaque étape a un style de visibilité automatiquement appliqué en fonction de si elle est l'étape active actuelle.
stepInnerUn conteneur autour du contenu de l'emplacement par défaut pour une étape.
stepActionsUn conteneur autour des boutons d'action pour passer d'une étape à l'autre.
stepPreviousUn conteneur autour du bouton d'action pour naviguer vers l'étape précédente.
stepNextUn conteneur autour du bouton d'action pour naviguer vers l'étape suivante.
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.