JavaScript React
4 min de lecture 243 vues

Rajouter des champs à la volée avec useFieldArray - React Hook Form - #3

ekimkael

Ekim Kael

@ekimkael

Rajouter des champs à la volée avec useFieldArray  - React Hook Form - #3

Votre application est en ligne, bon elle ne fait pas grand chose mais elle permet déjà d’enregistrer un ☝️ passager. Cependant monsieur Tanaka souhaite voyager avec ses deux fils et voudrais payer leurs tickets 🎫 en une fois, il fait la suggestion à votre service en espérant avoir la fonctionnalité pour l’achat du ticket retour, la satisfaction de nos clients étant notre priorité, donnons cette fonctionnalité à monsieur Tanaka.

Pour rajouter des champs à la volée React Hook Form nous offre le hook useFieldArray. Il s'utilise en complément de useForm et nous donne accès à des fonctions semblables à celle Array nous permettant d'ajouter, retirer, switcher de position à des champs ou groupes de champs à la volée.

Commencer par importer useFieldArray

import-usefieldarray.png

ensuite déstructurer pour avoir accès aux fonctions dont vous aurez besoin

usefieldarray-functions-properties.png

Les plus utiles sont:

  • fields qui contient la liste des champs ou groupes de champs qui peuvent être rajouter à la volée
  • append qui permet de rajouter un champ en dernière position / au bas de votre tableau
  • remove qui permet de supprimer un champ à la position indiquée

Comment ça marche

Lorsqu’on initialise useFieldArray on lui passe un objet contenant name et control.

  • name est la propriété qui contient le tableau des champs entrés à la volée.
  • control est un objet qui vient de useForm et qui contient les méthodes pour enregistrer des composants avec React Hook Form.

usefieldarray-control-name.png

Voici le résultat qu’on obtient lorsqu'on enregistre un passager avec notre nouveau système.

usefieldarray-final-result-visualisation.png

Au niveau de notre formulaire à proprement parler nous allons également également faire quelques changements. Tout d’abord nous allons afficher la liste des champs en faisant un map sur fields. Dans notre cas c'est tout le bloc contenant les champs d'un passager

{fields.map((field) => (
<div key={field.id}>
<input type="text" {...register("firstname")} />
<input type="text" {...register("lastname")} />
<input type="text" {...register("ID_type")} />
<input type="text" {...register("ID_number")} />
</div>
))}

Si on essaie d’afficher notre page on se rend compte que nos champs ont disparu

Screen Shot 2022-01-14 at 21.26.40.png

Ceci est tout à fait normal car pour le moment on a pas ajouté(manuellement) de passager.

Pour résoudre ce problème on peut ajouter un bouton permettant de rajouter un passager mais côté expérience utilisateur ce n'est pas top. Il faut que dès son arrivée sur l'app il est déjà des champs à remplir et pour que ce soit possible nous allons rajouter des paramètres par défaut à notre formulaire.

Parmi les propriétés que prend useForm en paramètre nous avons defaultValues qui permet de donner des valeurs par défaut aux champs qu'on veut.

usefieldarray-defaultvalues.png

Et si on réaffiche notre page TADA!!!

Screen Shot 2022-01-14 at 21.44.57.png

Lorsqu'on teste notre formulaire on se rend compte que le formulaire nous renvoie ceci:

usefieldarray-fields-no-index.png

On se rend compte que les propriétés contenant les informations de notre passager sont en dehors de passengers pourtant ce qu'on veut c'est qu'elles soient à l’intérieur. Ce problème survient parce que jusqu’ici on traite encore nos champs comme des éléments individuels alors qu'ils appartiennent à passengers et pour résoudre notre problème il faut passer le tableau avec l'index de l'élement à chaque champ comme ceci:

{fields.map((field, index) => (
<div key={field.id}>
<input type="text" {...register(`passengers[${index}].firstname`)} />
<input type="text" {...register(`passengers[${index}].lastname`)} />
<input type="text" {...register(`passengers[${index}].ID_type`)} />
<input type="text" {...register(`passengers[${index}].ID_number`)} />
</div>
))}

Si vous re-testez encore vous devriez avoir des problèmes à cause des validations avec yup mais voici ce que votre console allait vous renvoyer :

Screen Shot 2022-01-14 at 22.25.06.png

Qui veut dire que notre premier passager a bien été enregistré.

À cause des soucis de longueur nous allons divisé cet article en deux parties et dans la prochaine partie nous verrons comment faire les validations pour ce type de cas avec yup, vérifiez à ce que le premier passager ne soit pas supprimable et mettre un bouton pour pouvoir rajouter d'autre passagers.

Si cet article vous a plus, n’oubliez pas de liker, partager et on se retrouve dans le prochain.

ekimkael

Ekim Kael

@ekimkael

UX Engineer (- #Reactjs • #Nextjs • #Strapijs • #SwiftUI -) I love when beautiful things are useful.

Vous aimez cet article ? Faite le savoir en partageant