Next.js+TypeScriptで簡単にAPIでデータ取得する方法【useSWR/サンプルコードあり】

2022-05-08
Main Image

目次

こんにちは。

今回は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の簡単な使い方を実装してみました。

useStateuseEffectを使わずにAPIから非同期のデータ取得が簡単にできました。isValidatingを使うことで簡単に取得中と取得後でレンダー内容を変えることもできました。とても便利です。

参考 : Next.jsの入門書がAmazonで購入可能です!Kindle版もあります。日本語の解説書があるのは嬉しいですね。

React.js&Next.js超入門 第2版

ads【オススメ】未経験からプログラマーへ転職できる【GEEK JOBキャンプ】
▼ Amazonオススメ商品
ディスプレイライト デスクライト BenQ ScreenBar モニター掛け式
スマートLEDフロアライト 間接照明 Alexa/Google Home対応

Author

Penta

都内で働くITエンジニアもどき。好きなものは音楽・健康・貯金・シンプルでミニマルな暮らし。AWSクラウドやデータサイエンスを勉強中。学んだことや体験談をのんびり書いてます。TypeScript / Next.js / React / Python / AWS / インデックス投資 / 高配当株投資 More profile

Location : Tokyo, JPN

Contact : Twitter@penguinchord

Recommended Posts

Copy Right / Penguin Chord, ペンギンコード (penguinchord.com) 2022 / Twitter@penguinchord