useLoadingIndicator
このコンポーザブルはアプリページの読み込み状態にアクセスするためのものです。
説明
ページの読み込み状態を返すコンポーザブルです。<NuxtLoadingIndicator>によって使用され、制御可能です。状態を変更するためにpage:loading:startとpage:loading:endにフックします。
パラメータ
duration: 読み込みバーの持続時間(ミリ秒単位、デフォルトは2000)。throttle: 表示と非表示のスロットル(ミリ秒単位、デフォルトは200)。estimatedProgress: デフォルトではNuxtは100%に近づくにつれてバックオフします。進捗の推定をカスタマイズするための関数を提供できます。この関数は読み込みバーの持続時間(上記)と経過時間を受け取り、0から100の値を返す必要があります。
プロパティ
isLoading
- type:
Ref<boolean> - description: 読み込み状態
error
- type:
Ref<boolean> - description: エラー状態
progress
- type:
Ref<number> - description: 進捗状態。
0から100まで。
メソッド
start()
isLoadingをtrueに設定し、progressの値を増加させ始めます。startは{ force: true }オプションを受け取り、インターバルをスキップして即座に読み込み状態を表示します。
set()
progressの値を特定の値に設定します。setは{ force: true }オプションを受け取り、インターバルをスキップして即座に読み込み状態を表示します。
finish()
progressの値を100に設定し、すべてのタイマーとインターバルを停止してから500ミリ秒後に読み込み状態をリセットします。finishは状態がリセットされる前にインターバルをスキップするための{ force: true }オプションと、読み込みバーの色を変更しエラーのプロパティをtrueに設定するための{ error: true }を受け取ります。
clear()
finish()によって使用されます。コンポーザブルによって使用されるすべてのタイマーとインターバルをクリアします。
例
const { progress, isLoading, start, finish, clear } = useLoadingIndicator({
duration: 2000,
throttle: 200,
// これはデフォルトでの進捗の計算方法です
estimatedProgress: (duration, elapsed) => (2 / Math.PI * 100) * Math.atan(elapsed / duration * 100 / 50)
})
const { start, set } = useLoadingIndicator()
// set(0, { force: true })と同じ
// 進捗を0に設定し、即座に読み込みを表示
start({ force: true })tips
このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。
useLoadingIndicator の実践的な活用と注意点
Nuxt の useLoadingIndicator は、ページの読み込み状態を簡単に管理できる便利なコンポーザブルです。ユーザーに対して読み込み中であることを視覚的に示すことで、UX(ユーザーエクスペリエンス)を向上させることができます。特に SPA や SSR を組み合わせたアプリケーションで、ページ遷移や非同期処理の進捗を適切に伝えたい場合に役立ちます。
本記事では、useLoadingIndicator の基本的な使い方だけでなく、実務での活用例や注意すべきポイントを詳しく解説します。これにより、Nuxt アプリケーションの読み込み体験をより洗練されたものにできるでしょう。
まず結論:useLoadingIndicator のポイント
- ページの読み込み状態(
isLoading)や進捗(progress)をリアクティブに管理できる - 読み込み開始・進捗更新・完了をメソッドで制御可能(
start(),set(),finish()) - 読み込みバーの表示時間やスロットルをカスタマイズできる
- エラー状態の表示もサポート(
finish({ error: true })) - Nuxt のページ遷移イベントにフックして自動制御も可能
いつ使うべきか? 使わない方がよいケースは?
使うべきケース
- ページ遷移時や非同期データ取得時にユーザーに読み込み状況を明示したいとき
- 複数の非同期処理の進捗を統合して表示したい場合
- カスタムの読み込みバーやローディングUIを実装したいとき
- エラー発生時に読み込みバーの色を変えて視覚的に知らせたい場合
使わない方がよいケース
- 読み込み状態を単純に boolean で管理し、進捗表示が不要な場合(
useLoadingIndicatorは進捗管理がメイン) - 読み込みUIを独自に完全カスタマイズしていて、Nuxt の読み込みバーを使わない場合
- 読み込み状態が非常に短時間で終わるため、表示が逆にUXを損なう場合(過剰なローディング表示は避ける)
実務でよくあるユースケースとサンプルコード
1. ページ遷移時の読み込みバー制御
Nuxt のページ遷移イベントに連動して、読み込みバーを自動的に表示・非表示にする例です。
import { useLoadingIndicator } from '#app'
const { start, finish } = useLoadingIndicator()
// ページ遷移開始時に読み込みバーを表示
useRouter().beforeEach(() => {
start()
})
// ページ遷移完了時に読み込みバーを終了
useRouter().afterEach(() => {
finish()
})
このようにすると、ユーザーはページ遷移の進捗を視覚的に把握でき、待ち時間のストレスを軽減できます。
2. API 呼び出しなど非同期処理の進捗表示
API からのデータ取得中に読み込みバーを表示し、完了後に消す例です。
import { useLoadingIndicator } from '#app'
import { ref } from 'vue'
const { start, finish } = useLoadingIndicator()
const data = ref(null)
async function fetchData() {
start()
try {
const res = await fetch('/api/data')
data.value = await res.json()
} catch (e) {
finish({ error: true })
return
}
finish()
}
fetchData()
API 呼び出しの成功・失敗に応じて読み込みバーの色を変えられるため、ユーザーに状態をわかりやすく伝えられます。
3. カスタム進捗計算による読み込みバーの動き調整
estimatedProgress オプションを使い、進捗の増加速度を調整する例です。
import { useLoadingIndicator } from '#app'
const { progress, start, finish } = useLoadingIndicator({
duration: 3000,
estimatedProgress: (duration, elapsed) => {
// 緩やかに進み、最後に急激に100%に近づく動き
return Math.min(100, (elapsed / duration) ** 2 * 100)
}
})
start()
setTimeout(() => {
finish()
}, 3000)
このように進捗の動きをカスタマイズすることで、ユーザーに自然な読み込み感を与えられます。
よくある落とし穴・注意点
SSR と Hydration の影響
useLoadingIndicator はクライアントサイドでの読み込み状態管理が主な用途です。サーバーサイドレンダリング(SSR)時には読み込みバーは表示されません。Hydration(サーバーからクライアントへの状態引き継ぎ)時に読み込み状態が不整合になると、UIのちらつきや不自然な表示が起こることがあります。
過剰な読み込み表示は UX を損なう
読み込みバーを頻繁に表示・非表示すると、ユーザーにとって逆にストレスになる場合があります。特に短時間の処理で読み込みバーがチカチカするのは避けましょう。throttle オプションで表示のスロットルを調整し、一定時間以上の読み込み時のみ表示する工夫が必要です。
パフォーマンスへの影響
useLoadingIndicator は内部でタイマーやインターバルを使って進捗を管理します。大量に使いすぎるとパフォーマンスに影響が出る可能性があるため、必要な箇所だけで使うことを推奨します。
まとめ
useLoadingIndicator は Nuxt アプリケーションで読み込み状態を直感的に管理し、ユーザーにわかりやすく進捗を伝えるための強力なツールです。ページ遷移や非同期処理の読み込み表示に最適で、カスタマイズ性も高いのが特徴です。
ただし、SSR や Hydration の特性を理解し、過剰な表示を避けるなどの注意も必要です。実務ではページ遷移連動や API 呼び出し時の読み込み表示に活用し、ユーザー体験の向上に役立ててください。
useLoadingIndicator の estimatedProgress を工夫すると、読み込みバーの動きをより自然に見せられます。ユーザーの心理的な待ち時間短縮に効果的です。
読み込みバーの色変更は finish({ error: true }) のようにエラー時に使うと、視覚的に問題を伝えやすくなります。
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/api/composables/use-loading-indicator