Formulaires avec validation

Créez des formulaires accessibles, prévisibles et prêts pour la production à l'aide des primitives PyColors UI.

GuidesMise à jour 27 avril 2026
GuidesFormulaires

Vue d’ensembleLien vers la section

Les formes sont l’une des parties les plus fragiles d’un produit SaaS.

Ils combinent l'entrée utilisateur, les règles de validation, la soumission asynchrone, l'accessibilité, les états de chargement et la gestion des erreurs. Un bon modèle de forme rend ces responsabilités explicites au lieu de les cacher dans une abstraction opaque.

Ce guide montre comment construire des formulaires prévisibles en utilisant :

  • React Hook Form pour le form state
  • Zod pour la validation du schéma
  • PyColors UI pour les primitives d'interface accessibles

Pourquoi cela compte

Les formulaires sont l’endroit où les utilisateurs interagissent directement avec la logique de votre produit. Si la validation, les erreurs et les états de chargement ne semblent pas clairs, la confiance diminue rapidement.

Ce que vous allez construireLien vers la section

Première validation du schéma

Gardez les règles de validation proches du modèle de données avec des schémas explicites réutilisables.

Feedback accessible

Erreurs de champ de surface, échecs asynchrones et états de chargement avec sémantique accessible.

Flux de production

Gérer de manière prévisible les soumissions asynchrones, les tentatives, les états en attente et les échecs au niveau du formulaire.

Modèle mentalLien vers la section

Etat d'affichage des entrées. Les schémas définissent la vérité. Les formes coordonnent le flux.

Séparez ces responsabilités :

CoucheResponsabilité
SchémaDéfinit ce que les données valides signifient
État de la formeSuivi des valeurs, des erreurs, de l'état sale et de la soumission
primitives UIRendu des étiquettes, des champs, des boutons et des commentaires
Logique de soumissionAppelle le serveur et gère le succès ou l'échec

Règle du système

Les motifs de forme PyColors doivent rester explicites. Évitez les abstractions qui cachent les responsabilités de validation, de soumission et d’accessibilité derrière trop d’accessoires.

ÉtapesLien vers la section

Définir le schémaLien vers la section

Les règles de validation doivent être proches du modèle de données et non à l'intérieur du composant d'entrée visuel.

lib/forms/account-schema.ts
import { z } from "zod";

export const accountFormSchema = z.object({
  email: z.string().email("Enter a valid email address"),
  password: z.string().min(8, "Password must contain at least 8 characters"),
});

export type AccountFormValues = z.infer<typeof accountFormSchema>;

Cela vous donne un contrat réutilisable pour la validation côté client et la validation côté serveur.

Se connecter React Hook FormLien vers la section

React Hook Form coordonne les valeurs des champs, la sortie de validation et l'état de soumission.

components/account-form.tsx
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from "react-hook-form";

import {
  accountFormSchema,
  type AccountFormValues,
} from "@/lib/forms/account-schema";

const form = useForm<AccountFormValues>({
  resolver: zodResolver(accountFormSchema),
  defaultValues: {
    email: "",
    password: "",
  },
});

Note d ' exécution

Gardez les valeurs par défaut explicites. Cela rend le formulaire plus facile à raisonner, à tester et à réinitialiser après une soumission réussie.

Rendre les champs avec des erreurs explicitesLien vers la section

Les primitives PyColors UI rendent l'état. Ils ne possèdent pas les règles de validation.

components/account-form.tsx
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
  <Input
    label="Email"
    type="email"
    autoComplete="email"
    {...form.register("email")}
    error={form.formState.errors.email?.message}
  />

  <Input
    label="Password"
    type="password"
    autoComplete="current-password"
    {...form.register("password")}
    error={form.formState.errors.password?.message}
  />

  <Button type="submit" disabled={form.formState.isSubmitting}>
    {form.formState.isSubmitting ? "Saving…" : "Save changes"}
  </Button>
</form>

Cela permet de garder le contrat de composant simple: le champ reçoit le message d'erreur, le formulaire possède la validation, et le bouton reflète l'état de soumission.

Ajouter une rétroaction au niveau du formulaireLien vers la section

Certaines erreurs ne sont pas des erreurs de champ. Les défaillances du réseau, les problèmes d'autorisation et les erreurs inattendues du serveur nécessitent un retour au niveau du formulaire.

components/account-form.tsx
{
  formError ? (
    <Alert variant="destructive">
      <AlertTitle>Submission failed</AlertTitle>
      <AlertDescription>{formError}</AlertDescription>
    </Alert>
  ) : null;
}

Utiliser les erreurs de terrain pour les problèmes d'entrée. Utilisez des alertes pour les problèmes au niveau de la soumission.

Exemple completLien vers la section

Paramètres du compte

Prêt pour la validation

Cet aperçu montre la surface du formulaire. La validation des fils de l'onglet de code, les erreurs et l'état de soumission.

Guide de décisionLien vers la section

Utilisez ce modèle si :

  • le formulaire a des règles de validation réelles
  • le formulaire envoie les données de manière asynchrone
  • Les utilisateurs ont besoin d’un retour clair sur le terrain
  • les erreurs doivent être accessibles et explicites
  • le même motif apparaîtra sur les surfaces du produit

Évitez de trop abstraire si :

  • La forme change encore fréquemment
  • La logique de validation est cachée dans les composants de l'interface utilisateur
  • un seul composant de formulaire nécessite de nombreux accessoires conditionnels
  • l'abstraction rend le débogage plus difficile
  • L’accessibilité devient implicite

Préférez

  • schema-driven validation
  • Erreurs au niveau du champ près du champ
  • Alertes au niveau du formulaire pour les échecs de soumission
  • État de chargement du bouton clear soumettre
  • structure de forme petite, explicite et prévisible

Éviter

  • Abstrait toute la forme trop tôt
  • masquage des règles de validation dans les primitives de l'interface utilisateur
  • ne montrant qu'un toast pour bloquer les erreurs de formulaire
  • permettre des soumissions en double
  • ne compter que sur la couleur pour communiquer les erreurs

Liste de contrôle de productionLien vers la section

Avant d'expédier un formulaire, confirmez que :

  • chaque champ a une étiquette visible
  • Les messages de validation sont courts et spécifiques
  • Les erreurs de champ sont affichées à proximité du champ
  • submit est désactivé pendant que la demande est en cours d'exécution
  • Les erreurs async sont visibles dans le formulaire, pas seulement dans un toast
  • la navigation du clavier fonctionne du début à la soumission
  • La validation côté serveur reflète le contrat client

Prêt à déplacer ce modèle dans un véritable flux SaaS?

Starter Pro comprend des fondations adaptées à la production pour l'authentification, la facturation, les routes protégés et les flux de produits. /docs/starter-pro

Questions courantesLien vers la section

Prochaines étapesLien vers la section