useDelayedLoading
Zeigt einen Ladezustand nur, wenn die Arbeit tatsächlich langsam ist, und hält ihn dann lange genug, damit er nie flackert.
pnpm dlx shadcn@latest add https://hextaui.com/r/use-delayed-loading.jsonFügt den Hook und alles, wovon er abhängt, zu deinem Projekt hinzu.
Kopiere den folgenden Code und füge ihn in dein Projekt ein.
hooks/use-delayed-loading.ts Passe die Importpfade an dein Projekt-Setup an.
Übergib das rohe Loading-Flag und rendere aus dem zurückgegebenen Boolean. Die meisten Anfragen über eine warme Verbindung enden in unter 150ms. Dafür einen Spinner zu zeigen, ist schlechter als nichts zu zeigen: Er blitzt für einen oder zwei Frames auf und wirkt wie ein Glitch, nicht wie Fortschritt.
Der Hook wendet zwei Regeln an. Er wartet delay, bevor er etwas anzeigt, sodass Arbeit, die früher endet, nie einen Ladezustand zeigt. Sobald der Indikator sichtbar ist, bleibt er mindestens minDuration, sodass er nicht innerhalb weniger Frames erscheinen und verschwinden kann.
| Arbeit dauert | Beschreibung |
|---|---|
80ms | Es wird nichts angezeigt. |
250ms | Bei 150ms angezeigt und bis 550ms gehalten, dem 400ms-Minimum. |
900ms | Bei 150ms angezeigt und sofort ausgeblendet, wenn die Arbeit endet. |
Das 400ms-Minimum ist lang genug, um als bewusster Zustand wahrgenommen zu werden, und kurz genug, um niemanden zu bremsen.
- Schaltet
loadingwieder ein, solange der Indikator noch sichtbar ist, bleibt er einfach sichtbar. Es gibt kein erneutes Ausblenden und Einblenden. - Timer werden gelöscht, wenn sich die Eingaben ändern oder die Komponente unmountet, sodass nichts State aktualisiert, nachdem sie weg ist.
- Auf dem Server und beim ersten Render gibt er
falsezurück und führt daher nie zu einem Hydration-Mismatch.
Skeletons
Skeletons ersetzen Inhalt, daher ist ein Aufblitzen noch störender als bei einem Spinner. Hier ist der erste Ladevorgang langsam und zeigt das Skeleton. Spätere Ladevorgänge kommen aus einem Cache und zeigen es nie.
Erhöhe delay bei Indikatoren, die viel vom Bildschirm bedecken, wie Skeletons oder Overlays. Senke es Richtung 0 bei Aktionen, bei denen jede Wartezeit bestätigt werden muss, etwa einer Zahlung. Halte minDuration über etwa 300ms.
<Spinner loading={...} />und<Button loading>nutzen diese Timings bereits. Greife zum Hook, wenn du etwas anderes renderst.- Halte den Platz frei, den der Indikator einnehmen wird, wie es die Beispiele tun, damit sich das Layout beim Erscheinen nicht verschiebt.
- Kombiniere ihn mit einem
aria-busyoder einer Statusmeldung. Der Hook entscheidet nur, was visuell angezeigt wird.
| Prop | Typ | Standard |
|---|---|---|
loadingOb die Arbeit gerade läuft. | boolean | – |
options.delayMillisekunden, die vor dem Anzeigen des Ladezustands gewartet wird. | number | 150 |
options.minDurationMinimale Millisekunden, die der Ladezustand sichtbar bleibt, sobald er angezeigt wird. | number | 400 |
| Rückgabe | Beschreibung |
|---|---|
boolean | Ob der Ladezustand gezeigt werden soll. Auf dem Server immer false. |
Spinner über seine loading-Prop.