Créer des formulaires modernes et type-safe avec TanStack Form [Partie 1 - Introduction]
L'enfer du développeur est pavé de mauvais formulaires
Les formulaires sont un cauchemar incontournable dans le développement web et mobile : validation synchrone et asynchrone, récupération et affichage des erreurs, accessibilité, sérialisation et déserialisation des valeurs, responsivité, sauvegarde de l'état etc.
À ces impondérables s'ajoutent les différentes décisions UX à prendre : faut-il révéler les erreurs à mesure que l'utilisateur tape afin d'être le plus réactif possible au risque de le frustrer s'il n'est pas allé au bout de sa saisie ? Ajouter un délai avant de lancer la validation ? Doit-on plutôt attendre qu'il sorte du champ pour les lui signaler ? Ou une validation globale à la soumission du formulaire quitte à faire apparaître soudainement à l'écran une flopée d'erreurs alors qu'il pense en avoir fini ?
D'autant que pour s'épargner la création de certains composants complexes, il est souvent préférable de s'en remettre à des librairies UI avec derrière tout un travail pour assurer la bonne connexion de ces composants avec notre propre logique de validation et de gestion des erreurs.
Dès qu'on veut adresser toute la complexité inhérente aux formulaires on se retrouve vite avec dans des implémentations verbeuses et peu maintenables en raison de leur forte spécificité : chaque développeur recrée son petit système de gestion de formulaires.
Dès lors, quelles qualités devrait présenter une librairie de formulaires digne de ce nom pour remplacer notre implémentation maison qui se transforme vite en foutoir ?
- 👉 Standardisation : facilement réutilisable d'un projet à un autre
- 👉 Flexibilité et robustesse : couvrir les cas d'usage sans perdre en lisibilité ni sacrifier les performances
- 👉 Facile à apprendre
La bonne nouvelle ? Un sérieux candidat vient de rentrer en lice pour devenir votre prochain couteau suisse dans la gestion de formulaires !
The new form in town
Terrain jusqu'à présent dominé par React Hook Form et Formik, une nouvelle librairie Typescript sortie de la galaxie TanStack vient de bousculer ce petit monde : TanStack Form.
Compatible avec tous les frameworks frontend, TanStack Form offre un typage intégral de votre formulaire qui sécurise et accélère le développement.
Porté à l'échelle de plus grosses applications, il offre la possiblité particulièrement intéressante de "composer" ses formulaires à l'aide d'options et de composants réutilisables. On peut ainsi créer notre propre fabrique de formulaires avec des abstractions choisies mais toujours adossée à la librairie de base pour une personnalisation encore plus fine.
Créer son formulaire avec TanStack Form
Trêve de bavardages, passons aux travaux pratiques !
On initialise un formulaire TanStack Form de la façon suivante en React :
C'est à partir de ces defaultValues que TanStack Form va automatiquement inférer les types des champs du formulaire sans nécessiter de définition séparée.
Tout aussi important, une fonction onSubmit qui sera appelée à chaque tentative de validation.
Le form renvoyé par le hook va ensuite pouvoir être consommé par notre composant front pour bâtir le formulaire côté UI.
Ce form contient à la fois des composants tels que form.Field qui vont venir envelopper nos inputs pour les contrôler mais aussi des informations sur l'état actuel de notre formulaire (est-il valide ? quelles sont les erreurs en cours ? a-t-il été altéré depuis le chargement de la page ? etc.).
Première brique donc à poser : le composant form.Field dont l'attribut name se liera automatiquement à l'un des champs du formulaire déclarés plus haut.
Dernière étape pour assurer la validation du formulaire : désactiver le comportement par défaut du bouton de soumission qui survient sur <button type="submit"> car TanStack Form gère ça pour nous.
Cette précaution est cruciale pour empêcher le rechargement de la page, comportement qu'on souhaite éviter dans le cadre d'une SPA car il nous ferait sortir de notre routing et court-circuiterait les opérations de TanStack Form.
On va donc devoir en passer par la méthode form.handleSubmit() pour déclencher la validation du formulaire.
Avec TanStack Form, nos inputs sont contrôlés par le formulaire ce qui signifie que nous devons non seulement leur passer manuellement leur valeur via la prop value={field.state.value} mais aussi des events handlers pour réagir à la saisie de l'utilisateur et mettre à jour cette même valeur.
On utilise ainsi onChange sur la surface de l'input pour appeler field.handleChange() avec la nouvelle valeur du champ.
Voilà en deux coups de cuillère à pot un bon début de formulaire de connexion.
Ne reste plus qu'à ajouter la validation des champs et gérer les erreurs, des étapes que nous verrons dans la partie suivante.