useDelayedLoading
N'affiche un état de chargement que lorsque le travail est vraiment lent, puis le garde assez longtemps pour qu'il ne scintille jamais.
pnpm dlx shadcn@latest add https://hextaui.com/r/use-delayed-loading.jsonAjoute le hook et tout ce dont il dépend à votre projet.
Copiez et collez le code suivant dans votre projet.
hooks/use-delayed-loading.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
Passez l'indicateur de chargement brut et rendez à partir du booléen renvoyé. La plupart des requêtes sur une connexion chaude se terminent en moins de 150ms. Afficher un spinner pour celles-ci est pire que de ne rien afficher : il clignote une image ou deux et passe pour un bug, non pour une progression.
Le hook applique deux règles. Il attend delay avant d'afficher quoi que ce soit, si bien qu'un travail qui se termine plus tôt n'affiche jamais d'état de chargement. Une fois l'indicateur visible, il reste au moins minDuration, pour ne pas apparaître et disparaître en quelques images.
| Le travail prend | Description |
|---|---|
80ms | Rien n'est affiché. |
250ms | Affiché à 150ms et maintenu jusqu'à 550ms, le minimum de 400ms. |
900ms | Affiché à 150ms et masqué dès que le travail se termine. |
Le minimum de 400ms est assez long pour être perçu comme un état délibéré et assez court pour ne ralentir personne.
- Si
loadingrepasse à true alors que l'indicateur est encore visible, il reste simplement visible. Il n'y a pas de masquage puis de ré-affichage. - Les minuteurs sont effacés quand les entrées changent ou que le composant se démonte : rien ne met donc à jour l'état une fois le composant disparu.
- Côté serveur et pendant le premier rendu, il renvoie
false: il n'ajoute donc jamais de désaccord d'hydratation.
Skeletons
Les skeletons remplacent du contenu : un éclair est donc encore plus brutal qu'avec un spinner. Ici, le premier chargement est lent et affiche le skeleton. Les suivants viennent d'un cache et n'en affichent jamais.
Augmentez delay pour les indicateurs qui couvrent une grande partie de l'écran, comme les skeletons ou les overlays. Baissez-le vers 0 pour les actions où toute attente doit être signalée, comme un paiement. Gardez minDuration au-dessus d'environ 300ms.
<Spinner loading={...} />et<Button loading>utilisent déjà ces timings. Prenez le hook quand vous rendez autre chose.- Gardez la place que prendra l'indicateur, comme le font les exemples, pour que la mise en page ne bouge pas quand il apparaît.
- Associez-le à un
aria-busyou à un message de statut. Le hook ne décide que de ce qui s'affiche visuellement.
| Prop | Type | Par défaut |
|---|---|---|
loadingIndique si le travail est en cours à l'instant. | boolean | – |
options.delayMillisecondes d'attente avant d'afficher l'état de chargement. | number | 150 |
options.minDurationMillisecondes minimales pendant lesquelles l'état de chargement reste visible une fois affiché. | number | 400 |
| Valeur de retour | Description |
|---|---|
boolean | Indique s'il faut afficher l'état de chargement. Toujours false côté serveur. |
Spinner via sa prop loading.