Next.js+TypeScriptで簡単にAPIでデータ取得する方法【useSWR/サンプルコードあり】
目次
こんにちは。
今回はNext.jsでSWRを使って簡単にAPIからデータ取得する方法を実装してみました。
備忘録的に動いたコードを書いておきます。
useSWRとは
VercelのNext.js開発チームが開発したReactフック。
アプリケーションのデータ取得ロジックを簡潔にできます。キャッシュとリクエスト重複削除による速くて軽量な動作を提供しています。
引用
SWR は、まずキャッシュからデータを返し(stale)、次にフェッチリクエストを送り(revalidate)、最後に最新のデータを持ってくるという戦略です。
詳しくはこちら : https://swr.vercel.app/ja
useSWRのインストール
npm install swr
useSWRの使い方
取得したデータは{data}
で取り出します。取得エラーなら{error}
で取れます。
useSWR
の第一引数にkey(APIのURL)、次にそのkeyを渡して取得してくる関数を渡します。
const {data, error} = useSWR('/api/hello',fetcher)
useSWRの使用サンプルコード
例として、pages/api/hello.ts
のデータをフェッチしてきます。
呼ばれる側はこちら。GETできるデータはJSON形式で{ text: 'Hello' }
です。
import { NextApiRequest, NextApiResponse } from 'next'
export default (_: NextApiRequest, res: NextApiResponse) => {
res.status(200).json({ text: 'Hello' })
}
呼び出し側はこちら
import useSWR from 'swr'
export default function App() {
const fetcher = async(url:string) =>{
const res = await(await fetch(url)).json()
return res.text
}
const {data, isValidating} = useSWR('/api/hello',fetcher)
return(
<Layout>
{
isValidating
?<>Loading...</>
:String(data)
}
</Layout>
)
}
fetcher
は非同期関数で、API URLのデータをフェッチしてきます。呼び出される側のJSON形式にフォーマットしてreturn
しています。
非同期関数がよくわからんという方はこちらの記事にまとめています。TypeScriptの非同期処理とは何か・Promiseの基本的な使い方をまとめてみる【then/catch/finally/async/await】
また、isValidating
はデータ取得中にtrue
となる「状態」が格納されています。上記のように取得中はLoading...
を表示し、取得が完了したらデータを表示する、といったことが簡単に実現できます。
今回はローカルホストの小規模データを取得するので一瞬でLoading...
からHello
に変わりますが、外部URLへの問い合わせや大規模データに対してはスピナーを回しておくなどの応用ができそうです。
まとめ
というわけで今回はVercelが開発したReactフックuseSWR
の簡単な使い方を実装してみました。
useState
やuseEffect
を使わずにAPIから非同期のデータ取得が簡単にできました。isValidating
を使うことで簡単に取得中と取得後でレンダー内容を変えることもできました。とても便利です。
参考 : Next.jsの入門書がAmazonで購入可能です!Kindle版もあります。日本語の解説書があるのは嬉しいですね。