brand logo

ドキュメント

refreshNuxtData

Nuxtで全てまたは特定のasyncDataインスタンスをリフレッシュする

refreshNuxtDataは、useAsyncDatauseLazyAsyncDatauseFetchuseLazyFetchからのものを含む、全てまたは特定のasyncDataインスタンスを再取得するために使用されます。

コンポーネントが<KeepAlive>によってキャッシュされ、非アクティブ状態に入った場合でも、コンポーネントがアンマウントされるまで、その中のasyncDataは再取得され続けます。

refreshNuxtData(keys?: string | string[])

パラメータ

  • keys: データを取得するために使用されるkeysとしての単一の文字列または文字列の配列。このパラメータはオプションです。keysが明示的に指定されていない場合、全てのuseAsyncDataおよびuseFetchのキーが再取得されます。

戻り値

refreshNuxtDataはプロミスを返し、全てまたは特定のasyncDataインスタンスがリフレッシュされたときに解決されます。

全てのデータをリフレッシュ

以下の例では、NuxtアプリケーションでuseAsyncDatauseFetchを使用して取得されている全てのデータをリフレッシュします。

pages/some-page.vue
<script setup lang="ts">
const refreshing = ref(false)

async function refreshAll () {
  refreshing.value = true
  try {
    await refreshNuxtData()
  } finally {
    refreshing.value = false
  }
}
</script>

<template>
  <div>
    <button :disabled="refreshing" @click="refreshAll">
      全てのデータを再取得
    </button>
  </div>
</template>

特定のデータをリフレッシュ

以下の例では、キーがcountuserに一致するデータのみをリフレッシュします。

pages/some-page.vue
<script setup lang="ts">
const refreshing = ref(false)

async function refresh () {
  refreshing.value = true
  try {
    // 複数のデータをリフレッシュするためにキーの配列を渡すこともできます
    await refreshNuxtData(['count', 'user'])
  } finally {
    refreshing.value = false
  }
}
</script>

<template>
  <div v-if="refreshing">
    ローディング中
  </div>
  <button @click="refresh">リフレッシュ</button>
</template>

asyncDataインスタンスにアクセスできる場合は、そのrefreshまたはexecuteメソッドを使用してデータを再取得することを推奨します。

こちらも参照 getting-started > data-fetching

tips

このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。

refreshNuxtDataとは?〜非同期データの再取得を簡単に

Nuxtアプリケーションでは、useAsyncDatauseFetchなどのComposableを使って非同期データを取得します。これらのデータは初回のページレンダリング時にフェッチされますが、ユーザー操作や外部イベントに応じて最新のデータに更新したいケースが多々あります。そんなときに役立つのがrefreshNuxtDataです。

refreshNuxtDataは、アプリケーション内の全て、または指定したキーに対応する非同期データを再取得(リフレッシュ)するための関数です。これにより、手動で個別のデータ取得ロジックを呼び出すことなく、まとめてデータを更新できるため、開発効率が向上します。


まず結論:refreshNuxtDataのポイント

  • 全データまたは特定のキーの非同期データを再取得できる
  • Promiseを返すため、リフレッシュ完了を待ってUI制御が可能
  • keysパラメータは省略可能。省略時は全てのasyncData/fetchが対象
  • <KeepAlive>でキャッシュされたコンポーネント内のデータも再取得される
  • 個別のasyncDataインスタンスがあれば、そのrefreshexecuteを使う方が推奨される

いつ使うべき?使わない方がよいケースは?

使うべきケース

  • 複数の非同期データを一括で更新したいとき
    例:ユーザー操作で複数のAPIデータをまとめて最新化したい場合

  • ページ全体のデータをリフレッシュして最新状態に保ちたいとき
    例:リアルタイム性が求められるダッシュボードなど

  • コンポーネント単位ではなく、アプリケーション全体の非同期データを管理したいとき

使わない方がよいケース

  • 単一のasyncDataインスタンスだけを更新したい場合
    → そのインスタンスのrefreshexecuteメソッドを直接呼ぶ方が明示的で安全

  • 頻繁に大量のデータをリフレッシュするとパフォーマンスに影響が出る場合
    → 必要なデータだけを絞って更新する設計が望ましい

  • SSR(サーバーサイドレンダリング)直後の初期ロード時に使う必要はない
    → 初期フェッチは自動で行われるため


実務でよくあるユースケースとサンプルコード

1. ユーザー操作で全データをリフレッシュ

ユーザーが「最新情報を取得」ボタンを押したときに、全ての非同期データを再取得してUIを更新します。

<script setup lang="ts">
import { ref } from 'vue'
import { refreshNuxtData } from '#app'

const isRefreshing = ref(false)

async function refreshAllData() {
  isRefreshing.value = true
  try {
    await refreshNuxtData()
  } finally {
    isRefreshing.value = false
  }
}
</script>

<template>
  <button :disabled="isRefreshing" @click="refreshAllData">
    最新情報を取得
  </button>
</template>

2. 特定のキーに対応するデータだけを更新

複数の非同期データのうち、usernotificationsだけを更新したい場合。

<script setup lang="ts">
import { ref } from 'vue'
import { refreshNuxtData } from '#app'

const loading = ref(false)

async function refreshSelected() {
  loading.value = true
  try {
    await refreshNuxtData(['user', 'notifications'])
  } finally {
    loading.value = false
  }
}
</script>

<template>
  <button @click="refreshSelected" :disabled="loading">
    ユーザーデータと通知を更新
  </button>
</template>

3. <KeepAlive>でキャッシュされたコンポーネントのデータ更新

<KeepAlive>でキャッシュされたコンポーネントはアンマウントされないため、通常のライフサイクルフックでは再取得されません。refreshNuxtDataを使うことで、非アクティブ状態でもデータを強制的に更新できます。


よくある落とし穴・注意点

SSRとCSRの違いに注意

  • SSR時は初期データがサーバーで取得されているため、refreshNuxtDataは主にクライアントサイドでの再取得に使います。
  • CSRでの頻繁なリフレッシュはAPI負荷やパフォーマンスに影響するため、必要なタイミングでのみ呼び出しましょう。

Hydration(ハイドレーション)との関係

  • 初回レンダリング時のデータとクライアント側の状態が一致しないとHydrationエラーが発生する可能性があります。
  • refreshNuxtDataはユーザー操作後など、明示的にデータを更新したいタイミングで使うのが安全です。

パフォーマンス面の注意

  • 全ての非同期データを一度にリフレッシュすると、APIリクエストが集中し負荷が高まることがあります。
  • 可能な限り必要なキーだけを指定して更新する設計を心がけましょう。

asyncDataインスタンスの直接操作推奨

  • もし特定のasyncDataインスタンスにアクセスできるなら、そのrefreshexecuteメソッドを使う方が明示的でトラブルが少ないです。

まとめ

refreshNuxtDataは、Nuxtアプリケーション内の非同期データを効率的に再取得できる便利な関数です。複数のデータをまとめて更新したい場合や、キャッシュされたコンポーネントのデータを強制的に最新化したい場合に特に有効です。ただし、パフォーマンスやHydrationの観点から、使うタイミングや対象データは慎重に選びましょう。実務では、必要なキーだけを指定して更新したり、個別のasyncDataインスタンスのメソッドを活用することも検討してください。


refreshNuxtDataはPromiseを返すため、リフレッシュ中のUI制御(ローディング表示など)も簡単に実装できます。ユーザー体験の向上に役立てましょう。