nuxt logo

ドキュメント翻訳(非公式)

useNuxtData

データフェッチコンポーザブルの現在のキャッシュ値にアクセスします。

useNuxtData は、useAsyncDatauseLazyAsyncDatauseFetchuseLazyFetch の現在のキャッシュ値に、明示的に提供されたキーを使用してアクセスできます。

使用方法

useNuxtData コンポーザブルは、useAsyncDatauseLazyAsyncDatauseFetchuseLazyFetch などのデータフェッチコンポーザブルの現在のキャッシュ値にアクセスするために使用されます。データフェッチ時に使用したキーを提供することで、キャッシュされたデータを取得し、必要に応じて使用できます。

これは、既にフェッチされたデータを再利用したり、Optimistic Updates やカスケードデータ更新のような機能を実装したりすることで、パフォーマンスを最適化するのに特に有用です。

useNuxtData を使用するには、データフェッチコンポーザブル(useFetchuseAsyncData など)が明示的にキーを提供して呼び出されていることを確認してください。

パラメータ

  • key: キャッシュされたデータを識別する一意のキー。このキーは、元のデータフェッチ時に使用したものと一致する必要があります。

戻り値

  • data: 提供されたキーに関連付けられたキャッシュデータへのリアクティブな参照。キャッシュデータが存在しない場合、値は null になります。この Ref はキャッシュデータが変更されると自動的に更新され、コンポーネント内でシームレスなリアクティビティを可能にします。

以下の例は、サーバーから最新のデータがフェッチされる間、キャッシュされたデータをプレースホルダーとして使用する方法を示しています。

pages/posts.vue
// 後で 'posts' キーを使用して同じデータにアクセスできます
const { data } = await useFetch('/api/posts', { key: 'posts' })
pages/posts/[id\
// posts.vue(親ルート)での useFetch のキャッシュ値にアクセス
const { data: posts } = useNuxtData('posts')

const route = useRoute()

const { data } = useLazyFetch(`/api/posts/${route.params.id}`, {
  key: `post-${route.params.id}`,
  default() {
    // キャッシュから個々の投稿を見つけてデフォルト値として設定します。
    return posts.value.find(post => post.id === route.params.id)
  }
})

楽観的更新

以下の例は、useNuxtData を使用して楽観的更新を実装する方法を示しています。

楽観的更新は、サーバー操作が成功することを前提に、ユーザーインターフェースを即座に更新する手法です。操作が最終的に失敗した場合、UI は以前の状態にロールバックされます。

pages/todos.vue
// 後で 'todos' キーを使用して同じデータにアクセスできます
const { data } = await useAsyncData('todos', () => $fetch('/api/todos'))
components/NewTodo.vue
const newTodo = ref('')
let previousTodos = []

// todos.vue での useAsyncData のキャッシュ値にアクセス
const { data: todos } = useNuxtData('todos')

async function addTodo () {
  return $fetch('/api/addTodo', {
    method: 'post',
    body: {
      todo: newTodo.value
    },
    onRequest () {
      // フェッチが失敗した場合に復元するために、以前のキャッシュ値を保存します。
      previousTodos = todos.value

      // 楽観的に todos を更新します。
      todos.value = [...todos.value, newTodo.value]
    },
    onResponseError () {
      // リクエストが失敗した場合、データをロールバックします。
      todos.value = previousTodos
    },
    async onResponse () {
      // リクエストが成功した場合、バックグラウンドで todos を無効化します。
      await refreshNuxtData('todos')
    }
  })
}

useNuxtData<DataT = any> (key: string): { data: Ref<DataT | undefined> }