Utilisation de Yup et Formik pour implémenter la validation de la limite de caractères en ligne dans les formulaires React

Utilisation de Yup et Formik pour implémenter la validation de la limite de caractères en ligne dans les formulaires React
Utilisation de Yup et Formik pour implémenter la validation de la limite de caractères en ligne dans les formulaires React

Maîtriser la validation en ligne des limites de caractères dans les formulaires Formik

Travailler avec des formulaires dans Réagir peut souvent impliquer de gérer des règles de validation précises, notamment lors de l'utilisation de bibliothèques comme Formik et Ouais. Un scénario courant auquel les développeurs sont confrontés consiste à définir des limites de caractères dans les champs de saisie, par exemple en limitant les descriptions ou les zones de texte à 250 caractères.

Bien que l'ajout d'une limite maximale de caractères semble simple, l'activation d'erreurs de validation en ligne lorsque cette limite est dépassée peut présenter des défis. Par exemple, les propriétés HTML standard telles que maxLength empêchent les utilisateurs de taper au-delà de la limite, mais cela contourne Oui, la validation, qui doit enregistrer le 251ème caractère pour déclencher un message d'erreur.

Dans de telles situations, il peut être difficile de trouver le bon équilibre entre le blocage de l’entrée et la fourniture d’un retour d’information en temps réel. L'utilisation de solutions de contournement telles que la définition de limites supplémentaires ou le recours à des événements de flou de champ entraîne souvent une gestion des erreurs moins réactive ou peu intuitive.

Dans ce guide, nous explorerons une méthode permettant d'obtenir une validation en ligne immédiate sans compter sur longueurmax. En utilisant Formik avec Ouais, nous activerons des règles de validation personnalisées qui affichent un message d'erreur en direct lorsque la limite de caractères est dépassée, offrant ainsi une expérience transparente aux utilisateurs. 🚀

Commande Exemple d'utilisation
setFieldValue Utilisé pour mettre à jour par programme la valeur d'un champ de formulaire spécifique dans Formik. Ici, il met à jour dynamiquement le champ de description au fur et à mesure que les caractères sont saisis, permettant ainsi le comptage des caractères en temps réel.
setFieldTouched Cette commande définit manuellement l’état « touché » d’un champ de formulaire. Dans ce script, il est déclenché lorsque le nombre de caractères dépasse 250, permettant un retour de validation Yup sans obliger l'utilisateur à brouiller le champ de saisie.
validationSchema Spécifie les règles de validation Yup à Formik. Ici, il impose une limite de 250 caractères en intégrant le schéma descriptionValidation directement dans la configuration du formulaire.
Yup.string().max() Une méthode de validation Yup pour définir une contrainte de longueur maximale sur les chaînes. Dans ce script, il limite le champ de description à 250 caractères, affichant une erreur en cas de dépassement.
ErrorMessage Affiche les messages d'erreur en ligne dans Formik lorsque la validation échoue. Ici, il utilise la gestion des erreurs de Formik pour afficher immédiatement les messages si la limite de caractères est dépassée.
inputProps Définit des attributs supplémentaires pour TextField dans Material-UI. Cette commande définit des propriétés telles que le nombre maximum de lignes ou les limites de caractères, affectant le comportement et l'apparence du champ.
express.json() Middleware dans Express.js qui analyse les charges utiles JSON entrantes. Dans le script de validation backend, cette commande permet au serveur d'analyser et de gérer les données JSON dans req.body.
descriptionSchema.validate() Applique les règles de validation Yup côté serveur. Dans le script backend, il vérifie les données entrantes par rapport à la contrainte de limite de caractères et envoie une réponse basée sur le succès ou l'échec de la validation.
helperText Une propriété Material-UI dans TextField qui autorise des messages d'assistance personnalisés sous le champ. Dans ce cas, il affiche le nombre de caractères restants ou les erreurs de validation, améliorant ainsi l'expérience utilisateur.
ErrorMessage component="div" Utilisé pour personnaliser le rendu des messages d'erreur dans Formik. En la définissant sur div, cette commande contrôle le format et l'apparence des messages de validation.

Implémentation de la validation en ligne avec Formik et Yup pour des commentaires en temps réel

Les scripts React fournis ici visent à réaliser une validation en ligne en temps réel sur un champ de texte limité en caractères dans un formulaire Formik. Cette configuration utilise Formik pour une manipulation facile des formulaires et Ouais pour définir le schéma de validation. Le principal défi réside dans le fait que les attributs d’entrée HTML standards comme maxLength empêchent les utilisateurs de dépasser directement la limite de caractères, ce qui nous empêche de déclencher la validation de Yup. Donc, à la place, nous vérifions par programme le nombre de caractères et mettons à jour le fichier de Formik. touché statut si la limite est dépassée. Cette approche permet aux utilisateurs de voir les messages de validation au moment où ils atteignent 251 caractères, plutôt que d'attendre qu'ils quittent le champ. 🚀

Le premier script présente une méthode où Formik setFieldValue et setFieldTouched les commandes sont utilisées pour contrôler le comportement de l’entrée. Ici, au fur et à mesure que l'utilisateur tape, le gestionnaire onChange de Formik met à jour dynamiquement le description champ, permettant au nombre de caractères d'atteindre 251. Une fois que le nombre dépasse 250, setFieldTouched est déclenché pour marquer le champ comme « touché », ce qui active la validation de Yup, et un message d'erreur s'affiche en ligne. Ce retour immédiat est crucial pour garantir que les utilisateurs soient informés immédiatement, améliorant ainsi la convivialité et réduisant les erreurs. Imaginez que vous remplissez une candidature en ligne où un retour immédiat vous aide à savoir si vous devez modifier votre réponse sans attendre une erreur de soumission. 👍

La deuxième approche supprime entièrement l'attribut maxLength, en s'appuyant uniquement sur la validation du nombre de caractères par programme. Dans cette version, le gestionnaire d'événements onChange joue un rôle proactif en garantissant que si le nombre de caractères est inférieur ou égal à 250, la valeur du champ est mise à jour normalement. Si l'entrée atteint le seuil de 251 caractères, l'entrée ne bloque pas le caractère supplémentaire mais marque le champ comme étant touché. Cela permet de maintenir une expérience de frappe transparente, sans limites strictes, offrant ainsi une manière plus douce de gérer les débordements. Le helperText sert également de compteur de caractères en direct, aidant les utilisateurs à suivre leurs caractères restants au fur et à mesure qu'ils tapent, ce qui peut être extrêmement utile lorsque les limites de caractères sont strictes, comme dans les bios des réseaux sociaux ou dans les boîtes de message.

Enfin, la solution backend exploite Express et Yup pour valider la longueur d'entrée côté serveur, ce qui est utile pour plus de sécurité ou lorsque vous travaillez avec des points de terminaison d'API. Le serveur analyse les données JSON entrantes, les valide par rapport au schéma Yup et confirme le succès de la validation ou répond par un message d'erreur. Cette couche de validation permet de se prémunir contre les cas où les contrôles côté client pourraient être contournés, garantissant qu'aucune entrée ne dépasse 250 caractères, quelle que soit son origine. L’utilisation de la validation en couches à la fois en front-end et en back-end est une bonne pratique en matière de développement d’applications sécurisées, car elle offre une résilience contre les tentatives de contournement, ce qui en fait un excellent choix pour les environnements de production. De cette façon, si une validation côté client ne parvient pas à s'activer ou est contournée, le backend détectera et gérera toujours l'erreur, protégeant ainsi l'intégrité des données.

Implémentation de la validation en ligne dans un formulaire React à l'aide de Formik, Yup et TypeScript

Solution 1 : React Frontend Form avec validation Yup sur la limite de caractères

import React from 'react';
import { Field, Formik, Form, ErrorMessage } from 'formik';
import * as Yup from 'yup';
import TextField from '@material-ui/core/TextField';
// Define the validation schema with Yup, setting max length
const descriptionValidation = Yup.string()
  .max(250, 'Description cannot exceed 250 characters')
  .optional();
// Function component
const DescriptionForm = () => {
  return (
    <Formik
      initialValues={{ description: '' }}
      validationSchema={Yup.object({ description: descriptionValidation })}
      onSubmit={(values) => console.log('Submitted', values)}
    >
      {({ errors, touched, setFieldValue, setFieldTouched }) => (
        <Form>
          <Field
            as={TextField}
            name="description"
            label="Description"
            multiline
            rows={4}
            placeholder="Optional"
            error={Boolean(errors.description && touched.description)}
            helperText={
              errors.description && touched.description
                ? errors.description
                : 'Limit: 250 characters'
            }
            onChange={(event) => {
              const { value } = event.target;
              setFieldValue('description', value);
              if (value.length > 250) {
                setFieldTouched('description', true);
              }
            }}
          />
          <ErrorMessage name="description" component="div" className="error" />
        </Form>
      )}
    </Formik>
  );
};
export default DescriptionForm;

Validation en ligne alternative sans la propriété maxLength

Solution 2 : réagir avec la validation manuelle de la longueur des caractères sans bloquer la saisie

import React from 'react';
import { Field, Formik, Form, ErrorMessage } from 'formik';
import * as Yup from 'yup';
import TextField from '@material-ui/core/TextField';
// Yup schema for 250-character limit
const descriptionValidation = Yup.string()
  .max(250, 'Description cannot exceed 250 characters')
  .optional();
// Component definition
const DescriptionForm = () => {
  return (
    <Formik
      initialValues={{ description: '' }}
      validationSchema={Yup.object({ description: descriptionValidation })}
      onSubmit={(values) => console.log('Form Submitted:', values)}
    >
      {({ errors, touched, setFieldValue, setFieldTouched, values }) => (
        <Form>
          <TextField
            name="description"
            label="Description"
            multiline
            rows={4}
            placeholder="Optional"
            value={values.description}
            error={Boolean(errors.description && touched.description)}
            helperText={
              errors.description && touched.description
                ? errors.description
                : `Characters left: ${250 - values.description.length}`
            }
            onChange={(event) => {
              const { value } = event.target;
              if (value.length <= 250) {
                setFieldValue('description', value);
              } else {
                setFieldTouched('description', true);
              }
            }}
          />
          <ErrorMessage name="description" component="div" className="error" />
        </Form>
      )}
    </Formik>
  );
};
export default DescriptionForm;

Validation backend à l'aide d'Express.js et Yup pour la limite de caractères

Solution 3 : validation backend à l'aide de Node.js avec Express et Yup

const express = require('express');
const app = express();
const Yup = require('yup');
// Middleware for JSON parsing
app.use(express.json());
// Define Yup schema
const descriptionSchema = Yup.object().shape({
  description: Yup.string()
    .max(250, 'Description cannot exceed 250 characters')
    .optional(),
});
// POST route with validation
app.post('/submit', async (req, res) => {
  try {
    await descriptionSchema.validate(req.body);
    res.status(200).json({ message: 'Validation Passed' });
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});
// Server setup
app.listen(3000, () => console.log('Server running on port 3000'));

Extension des techniques de validation en ligne dans Formik et React

Lors de l'implémentation de la validation en ligne dans React avec Formik et Yup, une alternative à la validation onChange standard consiste à utiliser des fonctions anti-rebond personnalisées. En anti-rebondissant la saisie, vous pouvez retarder les contrôles de validation jusqu'à ce que l'utilisateur ait interrompu la saisie pendant une durée définie, créant ainsi une expérience plus fluide. Cela peut empêcher les erreurs de validation d'apparaître trop tôt ou de manière inattendue, ce qui est particulièrement utile lorsque les utilisateurs saisissent de longues réponses dans un champ avec une limite de caractères élevée. En utilisant un onChange anti-rebond, les développeurs peuvent réduire les validations inutiles, ce qui peut améliorer à la fois performance et l'expérience utilisateur, en particulier sur les appareils plus lents ou les formulaires volumineux. Imaginez que vous tapez vos coordonnées dans un long formulaire et que des messages d'erreur apparaissent seulement après une pause, ce qui semble beaucoup moins distrayant.

Une autre approche consiste à utiliser le système Formik ChampArray pour les champs dynamiques qui peuvent nécessiter des validations similaires, comme une liste de commentaires ou de notes où chacun a sa propre limite de caractères. Avec FieldArray, chaque entrée peut conserver son propre compteur de caractères et son propre état de validation indépendants, simplifiant ainsi les formulaires complexes. Vous pouvez configurer chaque champ pour afficher des messages de validation en temps réel à l'aide de Formik. setFieldTouched et le validateur maximum de Yup. Par exemple, si les utilisateurs doivent ajouter plusieurs notes courtes, FieldArray facilite l'application et la gestion des limites de validation sur chaque entrée, en affichant les erreurs en ligne spécifiques à chaque note.

Dans certains cas, combiner la validation de Formik avec des méthodes JavaScript natives permet un contrôle encore plus granulaire. Par exemple, en utilisant le substring en JavaScript, vous pouvez couper dynamiquement le texte d'entrée à la longueur requise avant le déclenchement de la validation. Cette méthode est très utile lorsqu’il est crucial que la saisie réponde à des normes exactes, comme lors de la restriction de la saisie de tweets ou de messages texte de longueur SMS. En combinant Formik avec des fonctions JavaScript telles que la sous-chaîne, les développeurs disposent d'un plus large éventail d'options pour contrôler à la fois l'expérience utilisateur et l'intégrité des données, garantissant que le texte est toujours dans des limites acceptables sans modifications manuelles ni réinitialisations de formulaire.

Foire aux questions sur la validation en ligne dans Formik et Yup

  1. Quel est le but principal de l'utilisation Formik avec Yup pour validation ?
  2. La combinaison de Formik et Yup simplifie la gestion et la validation des formulaires dans les applications React, en particulier pour les formulaires plus volumineux ou ayant des besoins de validation complexes. Formik gère l'état du formulaire, tandis que Yup gère les schémas de validation.
  3. Comment setFieldTouched différer de setFieldValue à Formik?
  4. setFieldTouched met à jour le statut « touché » d'un champ, le marquant comme ayant interagi à des fins de validation, tandis que setFieldValue met directement à jour la valeur du champ. Ensemble, ils aident à gérer quand et comment la validation a lieu.
  5. Puis-je utiliser les deux natifs maxLength et oui, validation ?
  6. L'utilisation de maxLength limite la longueur d'entrée sur le front-end mais peut empêcher la validation de Yup de se déclencher en cas d'erreurs en ligne. Si une validation en ligne est requise, envisagez de supprimer maxLength et de vous fier plutôt à Yup avec le gestionnaire onChange de Formik.
  7. Pourquoi devrais-je utiliser FieldArray avec validation en Formik ?
  8. FieldArray permet aux développeurs de gérer des formulaires dynamiques dans lesquels plusieurs champs suivent des règles de validation similaires, ce qui le rend idéal pour les listes d'éléments tels que des commentaires ou des balises où chaque entrée a des exigences spécifiques.
  9. Qu'est-ce qu'une fonction anti-rebond et pourquoi l'utiliser avec la validation Formik ?
  10. L'anti-rebond est une technique qui retarde la validation jusqu'à ce que l'utilisateur ait interrompu la saisie, réduisant ainsi les appels de validation excessifs. Ceci est particulièrement utile pour les champs de texte plus longs, évitant ainsi les messages de validation prématurés susceptibles de distraire les utilisateurs.
  11. Quelles sont les bonnes pratiques pour valider plusieurs champs avec Yup ?
  12. Utilisez Yup object et array des schémas pour définir une validation complexe et appliquer des messages d'erreur personnalisés pour indiquer clairement quels champs ne répondent pas aux exigences.
  13. Comment puis-je afficher dynamiquement les caractères restants à l’utilisateur ?
  14. En utilisant helperText dans le composant TextField de Material-UI, il est possible d'afficher le nombre de caractères en temps réel, ce qui peut améliorer la convivialité en aidant les utilisateurs à suivre leur capacité de saisie restante.
  15. La validation backend peut-elle remplacer la validation frontend par Yup ?
  16. La validation back-end est cruciale pour l'intégrité des données, mais la validation front-end fournit un retour immédiat aux utilisateurs, améliorant ainsi leur expérience. Les deux sont recommandés pour gérer les données de manière sécurisée et conviviale.
  17. Quel est l'avantage de supprimer le maxLength attribut pour la validation en ligne ?
  18. Suppression maxLength donne à Formik et Yup un contrôle total sur le processus de validation, permettant aux erreurs en ligne de s'afficher dès que la limite de caractères est dépassée, sans restreindre directement la longueur d'entrée.

Réflexions finales sur la validation en ligne en temps réel

La mise en œuvre de la validation en ligne avec Formik et Yup offre une expérience utilisateur plus fluide et plus interactive pour les champs limités en caractères. En supprimant longueurmax et en utilisant Formik setFieldTouched stratégiquement, les utilisateurs peuvent obtenir un retour instantané sans être interrompus par des limites strictes. Cette technique est idéale pour des scénarios tels que les formulaires de candidature ou les champs biologiques.

Cette approche offre de la flexibilité et peut être personnalisée davantage pour répondre à des besoins spécifiques. La validation en ligne des limites de caractères garantit la cohérence des données et une expérience conviviale, en particulier lors de la gestion de plusieurs champs basés sur des caractères. En combinant Formik, Yup et JavaScript, les développeurs peuvent offrir une validation à la fois intuitive et robuste aux utilisateurs. 🚀

Sources et lectures complémentaires sur les techniques de validation en ligne
  1. Fournit un aperçu complet de Formik et les techniques de gestion de la validation dans React. Documentation Formik .
  2. Détaille l'utilisation de Ouais comme outil de validation de schéma, particulièrement utile pour gérer les contraintes d'entrée. Ouais, référentiel GitHub .
  3. Discute des meilleures pratiques pour la mise en œuvre validation en ligne dans des frameworks front-end modernes, avec un accent sur React. Smashing Magazine : UX de validation de formulaire .
  4. Explorez la validation dynamique sur le terrain avec Formik setFieldTouched et comment il peut être appliqué aux erreurs en ligne. Documentation ReactJS : formulaires .