6.5 — Validation
⏱️ TL;DR — Deux approches : la validation native du navigateur (
.needs-validation+novalidate+ un peu de JS) qui colore les champs via les pseudo-classes CSS, et la validation serveur/manuelle où vous ajoutez.is-valid/.is-invalidvous-même. Les messages vont dans.valid-feedback/.invalid-feedback.
🎯 Objectifs
- Colorer les champs selon leur validité.
- Afficher des messages de feedback.
- Choisir entre validation native et manuelle.
Validation manuelle (états explicites)
<div class="mb-3">
<label class="form-label">E-mail</label>
<input class="form-control is-invalid" value="pas-un-email">
<div class="invalid-feedback">Adresse e-mail invalide.</div>
</div>
<div class="mb-3">
<label class="form-label">Pseudo</label>
<input class="form-control is-valid" value="alex">
<div class="valid-feedback">Parfait !</div>
</div>Vous contrôlez tout : ajoutez is-invalid (rouge) ou is-valid (vert) selon votre logique (souvent après une validation serveur). C’est l’approche idéale en React.
Validation native du navigateur
<form class="needs-validation" novalidate>
<div class="mb-3">
<label class="form-label">Nom</label>
<input class="form-control" required>
<div class="invalid-feedback">Le nom est requis.</div>
</div>
<button class="btn btn-primary" type="submit">Envoyer</button>
</form>// à la soumission, on active l'affichage des états
document.querySelectorAll('.needs-validation').forEach(form => {
form.addEventListener('submit', e => {
if (!form.checkValidity()) {
e.preventDefault(); e.stopPropagation()
}
form.classList.add('was-validated')
})
})novalidate désactive les bulles natives ; was-validated déclenche le style Bootstrap basé sur les pseudo-classes :valid/:invalid. Les contraintes viennent des attributs HTML (required, type="email", pattern, min…).
Feedback en tooltip
Remplacez .invalid-feedback par .invalid-tooltip (dans un parent position-relative) pour un message flottant.
⚠️ Piège — Sans
novalidate, le navigateur affiche ses propres bulles d’erreur en plus de Bootstrap. Metteznovalidatesur le<form>pour ne garder que le style Bootstrap.
💡 Pour un dev React — N’utilisez pas
checkValidity/was-validated: gérez la validité par l’état (souvent avec React Hook Form + un schéma Zod) et appliquez conditionnellementis-invalid+ un<div className="invalid-feedback">{error}</div>. Vous gardez le style Bootstrap et une logique React idiomatique.
✏️ Exercices
- Marquer un champ comme invalide avec un message, sans JS.
✅ Solution
<input class="form-control is-invalid">
<div class="invalid-feedback">Message d'erreur.</div>- Pourquoi mettre
novalidatesur un formulaire à validation Bootstrap native ?
✅ Solution
Pour supprimer les bulles d’erreur natives du navigateur et n’afficher que le style Bootstrap.
🧠 Quiz de révision
1. Quelles classes colorent un champ valide/invalide ?
is-valid et is-invalid.
2. Où mettre le message d’erreur ?
Dans un .invalid-feedback (ou .valid-feedback).
3. Quelle classe déclenche le style après validation native ?
was-validated (sur le formulaire).
4. Pourquoi novalidate ?
novalidate ?Pour désactiver les bulles natives et ne garder que le style Bootstrap.
5. Approche recommandée en React ?
Gérer la validité par l’état (ex. React Hook Form + Zod) et appliquer is-invalid conditionnellement.
🎉 Fin de la Partie 6 ! Partie suivante : Partie 7 — Utilitaires & Utility API