Next.js - SWR
背景
実務ではReactを使っているのですがNext.jsのキャッチアップしておきたいと思ったので、その内容を整理したいと思います。
本記事では、Next.jsに関する情報をまとめています。
内容は易しめです。
前回の続きになります!
SWRとは
SWR(Stale-while-revalidate)は、Next.jsによって提供されるデータフェッチングライブラリで、APIからデータをフェッチしてキャッシュすることでページ間でデータを共有し、高速な読み込みを実現します。
Reactと統合されたデータフェッチングライブラリであるため、例えばRailsで作成されたAPIエンドポイントをフェッチする場合にも使用することができます。
SWRは、Reactのフックとして提供されるため、Reactコンポーネント内で簡単に使用することができます。
SWRを利用する
使用方法
yarn add swr
SWRを利用するには、以下のようにimport文を用意しておきます。
import useSWR from 'swr'
インポートされるuseSWRというのが独自フックです。これを使って以下のようにSWRの値を定数に設定します。
定数 = useSWR( パス, [関数])
修正前 - useEffect
修正前のコードでは、useEffect
フックで状態の変更を監視し、変更されたタイミングでAPIからデータを取得し状態を更新していました。
export default function Home() { const [selected, setSelected] = useState("0") const [data, setData] = useState({id:0,data:{name:'-',email:'-',tel:'-'}}) useEffect(()=>{ fetch(`/api/hello?id=${selected}`) .then(res=>res.json()) .then(res=>setData(res)) },[selected]) const doAction = (e: React.ChangeEvent<HTMLSelectElement>) => setSelected(e.target.value)
修正後 - useSWR
修正後のコードではuseSWR
フックを使用しています。
第一引数に取得したいデータのURLを渡し、第二引数には、取得したデータをパースするための関数を渡します。この例ではfetcher
関数がデータの取得とパースを担当しています。
import useSWR from 'swr' const fetcher = (url: string) => fetch(url).then(res => res.json()) export default function Home() { const [selected, setSelected] = useState("0") const { data } = useSWR(`/api/hello?id=${selected}`, fetcher) const doAction = (e: React.ChangeEvent<HTMLSelectElement>) => setSelected(e.target.value)
自動的にAPIからデータを取得し、キャッシュしておいて、必要に応じて再利用することができます。
useSWRの返り値は複数のオブジェクトのため代入は分割代入で行う
値の代入はconst dataではなく、const {data}と分割代入にする必要があります。
useSWRで返されるのはデータだけではなく、エラー発生時にはエラーの値も合わせて返されます。
今回は返されるオブジェクトから値のデータだけをdataに取り出し利用していますが、**{data, err}**
というようにすれば、エラー発生時の情報をerrから得ることもできるようになります。
useSWR とuseEffect の使い分け
useSWR フックと useEffect フックは、両方とも React フックであり、React コンポーネントのライフサイクルを監視して、コンポーネントが描画されたときや、指定した変数が変更されたときに処理を実行することができます。
useEffect は、副作用を伴う一般的な処理
useEffectは、Reactのコンポーネント内で副作用を伴う処理を実行するために使用されます。
API からデータを取得したり、イベントリスナーを設定したりする場合などです。
useSWR は、API からデータを取得するために使用できるのはuseEffectと同じですが、取得したデータを簡単にキャッシュすることができます。
useSWRはAPIを取得する関数の監視を行う
useSWR は、コンポーネントの再描画をトリガーとするのではなく、API からデータを取得するという明示的なアクションによってのみ呼び出されるため、API からデータを取得するための処理を簡単に記述することができます。
useEffect は、監視している変数が変更されるたびに再度処理が実行されるため、意図しないタイミングで処理が実行される可能性があるため、API からデータを取得する場合は、useSWRが適しています。
続く…
コメント
本記事の内容は以上になります!
続きのアウトプットも随時更新したいと思います。
間違いがありましたら修正いたしますので、ご指摘ください。
興味があれば他の記事も更新していきますので是非ご覧になってください♪
プログラミングスクールのご紹介 (卒業生より)
お世話になったプログラミングスクールであるRUNTEQです♪
こちらのリンクを経由すると1万円引きになります。
RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。
もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。