useDelayedLoading
Mostra um estado de carregamento só quando o trabalho é realmente lento e o mantém por tempo suficiente para nunca piscar.
pnpm dlx shadcn@latest add https://hextaui.com/r/use-delayed-loading.jsonAdiciona o hook e tudo de que ele depende ao seu projeto.
Copie e cole o código a seguir no seu projeto.
hooks/use-delayed-loading.ts Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Passe a flag de carregamento bruta e renderize a partir do booleano que ele retorna. A maioria das requisições em uma conexão aquecida termina em menos de 150ms. Mostrar um spinner para elas é pior que não mostrar nada: ele pisca por um ou dois quadros e parece um defeito, não progresso.
O hook aplica duas regras. Espera delay antes de mostrar qualquer coisa, então o trabalho que termina antes nunca mostra um estado de carregamento. Depois de visível, o indicador permanece por pelo menos minDuration, para não aparecer e sumir em poucos quadros.
| O trabalho leva | Descrição |
|---|---|
80ms | Nada é exibido. |
250ms | Exibido aos 150ms e mantido até 550ms, o mínimo de 400ms. |
900ms | Exibido aos 150ms e ocultado assim que o trabalho termina. |
O mínimo de 400ms é longo o bastante para ser percebido como um estado deliberado e curto o bastante para não atrasar ninguém.
- Se
loadingvoltar a ligar enquanto o indicador ainda está visível, ele simplesmente permanece visível. Não há ocultar e mostrar de novo. - Os temporizadores são limpos quando as entradas mudam ou o componente é desmontado, então nada atualiza o estado depois que ele sumiu.
- No servidor e durante a primeira renderização ele retorna
false, então nunca causa divergência de hidratação.
Skeletons
Skeletons substituem conteúdo, então um flash é ainda mais brusco do que com um spinner. Aqui o primeiro carregamento é lento e mostra o skeleton. Os seguintes vêm de um cache e nunca mostram.
Aumente delay para indicadores que cobrem boa parte da tela, como skeletons ou overlays. Diminua em direção a 0 para ações em que qualquer espera precisa ser reconhecida, como um pagamento. Mantenha minDuration acima de cerca de 300ms.
<Spinner loading={...} />e<Button loading>já usam estes tempos. Recorra ao hook quando renderizar outra coisa.- Reserve o espaço que o indicador ocupará, como fazem os exemplos, para o layout não se deslocar quando ele aparecer.
- Combine com um
aria-busyou uma mensagem de status. O hook apenas decide o que mostrar visualmente.
| Prop | Tipo | Padrão |
|---|---|---|
loadingSe o trabalho está em andamento agora. | boolean | – |
options.delayMilissegundos a esperar antes de mostrar o estado de carregamento. | number | 150 |
options.minDurationMínimo de milissegundos que o estado de carregamento permanece visível depois de exibido. | number | 400 |
| Retorna | Descrição |
|---|---|
boolean | Se deve mostrar o estado de carregamento. Sempre false no servidor. |
Spinner por meio da sua prop loading.