Nuxt.jsデータ取得
Nuxt.jsデータ取得
Nuxt.js (ユニバーサルアプリケーション)では、サーバーサイドレンダリング中にデータをレンダリングするために Nuxt.js 特有のフックを使う必要があります。
この方法について調査したので、記載する。
非同期データ読み込み方法
Nuxtでは非同期なデータを読み込むために2つのフックが用意されている。
- fetchフック
- 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ライフサイクルについて
SSRとCSRのライフサイクルはplugin→middleware→validate→asyncData→fetch→beforeCreateの順で処理が実行されてます。
タイミング的にはどちらも同じなので大きな差異はないです。
参考
Nuxt.jsのasyncDataとfetchは何が違うのか - Qiita