技術ブログ

(技術系中心)基本自分用備忘録なので、あくまで参考程度でお願いします。

Nuxt.jsデータ取得

Nuxt.jsデータ取得

Nuxt.js (ユニバーサルアプリケーション)では、サーバーサイドレンダリング中にデータをレンダリングするために Nuxt.js 特有のフックを使う必要があります。

この方法について調査したので、記載する。

非同期データ読み込み方法

Nuxtでは非同期なデータを読み込むために2つのフックが用意されている。

  1. fetchフック
  2. asyncDataフック

fetchフック

1. 外部から取得したデータをVuexのstoreに格納して使用する
2. acyncDataとは違ってコンポーネントに値を直接セットすることができない

例)

<template>
  <div>{{ $store.state.hige }}</div>
</template>

<script>
export default {
  async fetch({ app, store }) {
    const doc = await app.$firebase.firestore().collection('hige').get()
    store.commit('setHige', doc.data().hige)
  }
}
</script>
<script>
export default {
  async fetch ({ store, params }) {
    await store.dispatch('GET_STARS');
  }
}
</script>
export const actions = {
  async GET_STARS ({ commit }) {
    const { data } = await axios.get('http://my-api/stars')
    commit('SET_STARS', data)
  }
}

注意:fetch内ではコンポーネントインスタンス化される前に呼び出されるため、thisを通してコンポーネントインスタンスにアクセスすることはできません。

asyncDataフック

1. 外部からデータを取得し、ページコンポーネントへ直接セットする
2. 返される値はコンポーネントのテンプレートからアクセスすることで使用できる

利用例)

<template>
  <div>{{ hoge }}</div>
</template>

<script>
export default {
  async asyncData({ app }) {
    const doc = await app.$firebase.firestore().collection('hoge').get()
    return { hoge: doc.data().hoge }
  }
}
</script>

注意:asyncData メソッド内で、thisを使用してはいけません。 asyncData メソッドはコンポーネントインスタンス化される前に 呼び出されるためです

asyncDataとfetchの共通点

両者ともページコンポーネントの初期化前に実行される関数。 両処理はコンポーネントインスタンスが生成される前に行われるため、 this を通してコンポーネントインスタンスにアクセスすることはできません。

第1引数にcontext(オブジェクト)を取るので、クエリパラメータなどの値にアクセスして処理を行うことができる。

asyncDataとfetchの使い分け

以下のような方針で fetch と asyncData を使い分けるのが良さそうです。

asyncDataは外部から取得したデータをページコンポーネントのみで使用する場合に使用する

fetchは取得したデータをVuexのstoreに格納して使用したい場合に使用する

fetchはストアに保存するための処理をかく。 asyncDataはコンポーネントにデータをセットするための処理をかく。

asyncDataとfetchライフサイクルについて

SSRCSRのライフサイクルはplugin→middleware→validate→asyncData→fetch→beforeCreateの順で処理が実行されてます。

タイミング的にはどちらも同じなので大きな差異はないです。

参考

データの取得 - NuxtJS

Nuxt.jsのasyncDataとfetchは何が違うのか - Qiita

【Nuxt.js】 asyncDataとfetchって結局どう使うの?

nuxtのasyncData / fetchの使い分け - inokawablog