前置き
非同期通信に使えるfetch
をご紹介🌟
APIからデータを取得する方法は2つ!fetch
asyncData
2つの違いについても解説しました🎀👩🏫
⬇️asyncDataの記事はこちら
asyncDataとの違い
値のセット先が違う
asyncData
:直接コンポーネントにセットfetch
:Vuexのstoreに格納📦
呼び出されるタイミングが違う
asyncData
:インスタンス作成前fetch
:インスタンス作成後
The Nuxt.js
https://ja.nuxtjs.org/guides/features/data-fetching/fetch
hook is called after the component instance is created on the server-side:this
is available inside it.
【翻訳】
Nuxt.jsフェッチフックは、
サーバー側でコンポーネントインスタンスが
作成された後に呼び出されます。
これは、その内部で使用できます。
違いはこれくらいです!
他はほとんど変わりません🌟
基本的にはasyncDataと同じ
使い方・書き方
asyncData
とほとんど一緒です👌Promise
を返すかasync/await
を使うかです💡
詳しい書き方はasyncData
の記事をご覧ください👀
thisが使えない
this
を通してコンポーネントのインスタンスに
アクセスすることができません💥
使用箇所
pages
内コンポーネントのみ使用可能
fetch
fetchとは
asyncDataとの違いにも書きましたが
API通信の結果をVuex
のstoreに格納するものです🧸
公式ガイドはこちら
https://ja.nuxtjs.org/api/pages-fetch/
簡単な使い方
JSONPlaceholderを表示させるだけ
https://jsonplaceholder.typicode.com/posts
axiosを使うのでinstallします📥
axiosの解説はこちら
https://wp.me/pc9NHC-gr
terminal
$ npm install --save @nuxtjs/axios
解説
syncData
と一緒ですね❣️Promise
を返すかasync/await
を使うかです。
今回はasync/await
を使用しました。await
がPromise
の役割をしています。
こちらについてもasyncDataで
解説しているので、ご確認ください👀
https://wp.me/pc9NHC-ut
コード
極力コードを最小限にするために
v-forなどは使わず、
gettersも使わずstoreを直接呼び出しています!
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<template> <div class="page"> <p>{{ $store.state.jsonData }}</p> </div> </template> <script> import axios from 'axios' export default { async fetch ({ store }) { let { data } = await axios.get('https://jsonplaceholder.typicode.com/posts') store.commit('setData', data) } } </script> |
) file
1 2 3 4 5 6 7 8 9 |
export const state = () => ({ jsonData: [], }) export const mutations = { setData(state, data) { state.jsonData = data }, } |
リスト化した場合
今度は先ほどのJSONPlaceholderのtitle
だけをリスト化してみます🌟
コード
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<template> <div class="page"> <ul> <li v-for="data in jsonData" :key="data.id" > {{ data.title }} </li> </ul> </div> </template> <script> import axios from 'axios' export default { computed: { jsonData () { return this.$store.getters['jsonData'] }, }, async fetch ({ store }) { let { data } = await axios.get('https://jsonplaceholder.typicode.com/posts') store.commit('setData', data) } } </script> |
) file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
export const state = () => ({ jsonData: [], }) export const getters = { jsonData: state => { return state.jsonData }, } export const mutations = { setData(state, data) { state.jsonData = data }, } |
paramsを使用した場合
JSONPlaceholder
今度はこちらを動的ルーティングとparams
を使用して取得してみます🌟
https://jsonplaceholder.typicode.com/posts/1
ここのtitleだけ表示させてみます💡ul>li
の必要がないのでp
タグで表示させます。
解説
- 動的ルーティングのため
index.vue
ではなく_id.vue
を使用 context
にparams
とroute
を追加- url部分はテンプレートリテラル
`(バッククオート)
の中に${変数}
を使って記載
使わない場合は'(シングルクオート)
の中に+ $route.params.id
を連結
コード
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<template> <div class="page"> <p>{{ jsonData.title }}</p> </div> </template> <script> import axios from 'axios' export default { computed: { jsonData () { return this.$store.getters['jsonData'] }, }, async fetch ({ store, params, route }) { let { data } = await axios.get(`https://jsonplaceholder.typicode.com/posts/${route.params.id}`) console.log(data) store.commit('setData', data) } } </script> |
) file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
export const state = () => ({ jsonData: [], }) export const getters = { jsonData: state => { return state.jsonData }, } export const mutations = { setData(state, data) { state.jsonData = data }, } |
まとめ
- 使い方はasyncDataと同じ
- 違いは値のセットの仕方と呼び出されるタイミング