Formulaires avec validation
Créez des formulaires accessibles, prévisibles et prêts pour la production à l'aide des primitives PyColors UI.
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
Feedback accessible
Flux de production
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 :
| Couche | Responsabilité |
|---|---|
| Schéma | Définit ce que les données valides signifient |
| État de la forme | Suivi des valeurs, des erreurs, de l'état sale et de la soumission |
| primitives UI | Rendu des étiquettes, des champs, des boutons et des commentaires |
| Logique de soumission | Appelle 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.
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.
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.
<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.
{
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