useDelayedLoading
処理が実際に遅いときだけ読み込み状態を表示し、ちらつかないよう十分な時間表示し続けます。
loading
useDelayedLoading(loading)
pnpm dlx shadcn@latest add https://hextaui.com/r/use-delayed-loading.jsonフックと、その依存関係をプロジェクトに追加します。
次のコードをコピーしてプロジェクトに貼り付けてください。
hooks/use-delayed-loading.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
生の loading フラグを渡し、返された真偽値から描画します。ウォーム接続でのほとんどのリクエストは150ms未満で終わります。そのためにスピナーを表示すると、何も表示しないより悪くなります。1〜2フレームだけ点滅し、進行ではなく不具合に見えるためです。
このフックは2つのルールを適用します。delay が経つまでは何も表示しないため、それより早く終わる処理は読み込み状態を表示しません。インジケーターが表示されたら最低でも minDuration は表示され続けるため、数フレームのうちに現れて消えることはありません。
| 処理にかかる時間 | 説明 |
|---|---|
80ms | 何も表示されません。 |
250ms | 150msで表示され、最低400msの猶予により550msまで保持されます。 |
900ms | 150msで表示され、処理が終わるとすぐに非表示になります。 |
400msの最小時間は、意図的な状態として認識されるのに十分な長さで、誰かを待たせない程度に短い時間です。
- インジケーターがまだ表示されている間に
loadingが再びオンになった場合は、そのまま表示され続けます。非表示にして再表示することはありません。 - 入力が変わったときやコンポーネントがアンマウントされたときにタイマーはクリアされるので、消えた後に状態が更新されることはありません。
- サーバー上と最初のレンダリング中は
falseを返すため、ハイドレーションの不一致を生むことはありません。
スケルトン
スケルトンはコンテンツを置き換えるため、一瞬の点滅はスピナーよりさらに目障りです。ここでは最初の読み込みが遅くスケルトンが表示されます。以降の読み込みはキャッシュから行われ、表示されません。
スケルトンやオーバーレイのように画面の広い範囲を覆うインジケーターでは、delay を大きくします。支払いのように、どんな待ち時間でも反応が必要な操作では、0に近づけます。minDuration は約300ms以上に保ってください。
<Spinner loading={...} />と<Button loading>はすでにこのタイミングを使っています。それ以外のものを描画するときにこのフックを使ってください。- 例のように、インジケーターが占める空間を確保しておくと、表示されたときにレイアウトがずれません。
aria-busyやステータスメッセージと組み合わせてください。このフックが決めるのは、視覚的に何を表示するかだけです。
| プロパティ | 型 | デフォルト |
|---|---|---|
loading処理がいま進行中かどうか。 | boolean | – |
options.delay読み込み状態を表示するまでの待機時間(ミリ秒)。 | number | 150 |
options.minDuration読み込み状態が表示された後、最低限表示され続けるミリ秒。 | number | 400 |
| 戻り値 | 説明 |
|---|---|
boolean | 読み込み状態を表示するかどうか。サーバーでは常に false です。 |
loading prop を通じた Spinner。