useDelayedLoading
Muestra un estado de carga solo cuando el trabajo es realmente lento, y lo mantiene el tiempo suficiente para que nunca parpadee.
pnpm dlx shadcn@latest add https://hextaui.com/r/use-delayed-loading.jsonAñade el hook y todo lo que necesita a tu proyecto.
Copia y pega el siguiente código en tu proyecto.
hooks/use-delayed-loading.ts Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
Pasa el indicador de carga sin procesar y renderiza a partir del booleano que devuelve. La mayoría de las peticiones en una conexión caliente terminan en menos de 150ms. Mostrar un spinner para ellas es peor que no mostrar nada: parpadea durante un fotograma o dos y se lee como un fallo, no como progreso.
El hook aplica dos reglas. Espera delay antes de mostrar nada, así que el trabajo que termina antes nunca muestra un estado de carga. Una vez visible el indicador, permanece al menos minDuration, para que no pueda aparecer y desaparecer en pocos fotogramas.
| El trabajo tarda | Descripción |
|---|---|
80ms | No se muestra nada. |
250ms | Se muestra a los 150ms y se mantiene hasta los 550ms, el mínimo de 400ms. |
900ms | Se muestra a los 150ms y se oculta en cuanto termina el trabajo. |
El mínimo de 400ms es lo bastante largo para percibirse como un estado deliberado y lo bastante corto para no ralentizar a nadie.
- Si
loadingvuelve a activarse mientras el indicador sigue visible, simplemente permanece visible. No se oculta y se vuelve a mostrar. - Los temporizadores se limpian cuando cambian las entradas o el componente se desmonta, así que nada actualiza el estado una vez desaparecido.
- En el servidor y durante el primer renderizado devuelve
false, así que nunca añade una discrepancia de hidratación.
Skeletons
Los skeletons sustituyen contenido, así que un parpadeo es aún más molesto que con un spinner. Aquí la primera carga es lenta y muestra el skeleton. Las cargas posteriores vienen de una caché y nunca lo muestran.
Sube delay para indicadores que cubren gran parte de la pantalla, como skeletons u overlays. Bájalo hacia 0 para acciones en las que cualquier espera necesita reconocerse, como un pago. Mantén minDuration por encima de unos 300ms.
<Spinner loading={...} />y<Button loading>ya usan estos tiempos. Recurre al hook cuando renderices otra cosa.- Reserva el espacio que ocupará el indicador, como hacen los ejemplos, para que el diseño no se desplace cuando aparezca.
- Combínalo con un
aria-busyo un mensaje de estado. El hook solo decide qué mostrar visualmente.
| Prop | Tipo | Predeterminado |
|---|---|---|
loadingSi el trabajo está en curso ahora mismo. | boolean | – |
options.delayMilisegundos de espera antes de mostrar el estado de carga. | number | 150 |
options.minDurationMilisegundos mínimos que el estado de carga permanece visible una vez mostrado. | number | 400 |
| Devuelve | Descripción |
|---|---|
boolean | Si se debe mostrar el estado de carga. Siempre false en el servidor. |
Spinner mediante su prop loading.