バックエンドからデータを取得

先ほどのuseEffectを利用して、バックエンドからデータを取得する方法を説明します。今回バックエンドは学習用に用意された以下のサイトを利用します。

バックエンドのAPIからデータを取得するために、axiosというライブラリをインストールします。

npm install axios

axiosをインストールしたら、JsonPlaceholderの https://jsonplaceholder.typicode.com/postarrow-up-right というURLを叩いて投稿一覧を取得しましょう。useEffect内にて、axios.get(url)とすることで、データを取得することができます。axios.get(url)にて返却する型ですが、Promise型という型で、非同期処理の操作が完了したときに結果を返却するものです。

まず非同期処理の説明の前に同期処理の説明をします。同期処理とは、上から順に処理が行われることで、以下コードがあった場合1,2,3と順番にコンソールに出力されるかと思います。

一方で非同期処理はその処理が完了するのを待たずに次の処理が実行されます。その時点で非同期処理をコンソールに出力しようとすると、pendingというPromise型のオブジェクトが返却されます。

そのPromise型の処理結果を受け取るためには、.thenと繋げることで処理結果を受け取ることができます。ですので、axios.get(url).then((res) => ...)と記述することで、バックエンドからデータを取得することができます。まずは取得した結果をコンソールに出力してみましょう。

以下のようなオブジェクトが出力されるかと思います。投稿一覧はdataプロパティに格納されています。

こちらのデータをpostListというstateを作り、取得した投稿一覧を格納しましょう。

そして、Post型を作り、postListの型をPost型の配列にしましょう。

また、res.dataの型をaxios.get<Post[]>(...)と宣言することができます。

格納した投稿一覧をUserListを作成したときのようにtableタグにて表示するようにしましょう。

これで投稿一覧が表示されました。

次に投稿一覧から、特定のユーザーIDのもののみを表示するようにしましょう。先ほど、useEffectにてuserIdを監視するようにしましたが、バックエンドのAPIを叩く際にuserIdなどのパラメータを渡して、バックエンド側でフィルターをかけるような実装が多々あります。そういった場合は、userIdを監視するようにするのですが、今回はフロントエンド側でフィルターをかけるようにしますので、useEffectの監視する値を空としましょう。

そして、postListmapする前にuserIdにてfilterしましょう

上記にて、userIdを変更することで投稿内容を特定のユーザーのみにフィルターすることができます。

Last updated