Apps

015-Poke picture book|Step2_PokeAPIでデータを取得

はじめに

ポケモン図鑑アプリでは、ポケモンの情報を取得するためにPokeAPIを利用します。

本記事では、fetch を使ってAPIからデータを取得し、取得したデータをコンソールに表示するところまでを実装していきます。

Step2-1:Poke APIの中身を確認

https://pokeapi.co

JSONVueをインストール(Google拡張機能)

pokeAPIにどんなデータがあるのかJSON形式で確認

App.js

import './App.css';

function App() {
  return (
    <div className="App">
      const initialURL = "https://pokeapi.co/api/v2/pokemon"; #このエンドポイントを例えばpokemon/1にするとフシギダネのデータを取得できる。ここを使って様々なデータを取得する
      
    </div>
  );
}

export default App;

Step2-2:Poke APIのポケモンデータを全て取得する

App.js

import { useEffect } from 'react';
import './App.css';
import { getAllPokemon } from './utils/pokemon';
function App() {
  const initialURL = "https://pokeapi.co/api/v2/pokemon";

  useEffect(()=>{
    const fetchPokemonData = async () => {
      // 全てのポケモンデータを取得
      let res = await getAllPokemon(initialURL);
      console.log(res);
    };
    fetchPokemonData();
  },[]);

  return (
    <div className="App">
      
    </div>
  );
}

export default App;

src/utils/pokemon.js

export const getAllPokemon = (url) => {
    return new Promise((resolve, reject) => {
        fetch(url)
            .then((res) => res.json())
            .then((data) => resolve(data));
    });
};

動作確認

小学生でも理解できるように説明してください。

ポケモンデータを取ってくるプログラム!

このプログラムは、**「ポケモンの情報をインターネットから取ってきて使う」**というものだよ!
ポケモンの情報をもらうために、「PokeAPI(ポケモンのデータがいっぱいあるサイト)」を使っているよ。


コードを分けて考えよう!

このプログラムは 2つの大事な部分 に分かれているよ!

  1. ポケモンデータをもらう関数getAllPokemon
  2. ポケモンデータを使うアプリApp

1. ポケモンデータをもらう関数 (getAllPokemon)

export const getAllPokemon = (url) => {
    return new Promise((resolve, reject) => {
        fetch(url)
            .then((res) => res.json())
            .then((data) => resolve(data));
    });
};

この関数の働き

この関数は 「ポケモンのデータをPokeAPIからもらう」 という仕事をするよ!

fetch(url) とは?
  • fetch(url) は、インターネット上のデータをもらうためのもの。
  • url の場所に行って、データを取ってくるよ。
  • 例えば url"https://pokeapi.co/api/v2/pokemon" を入れると、ポケモンのデータを取れるよ。
「.then((res) => res.json())」の意味
  • res.json() は、「取ってきたデータを分かりやすい形(JSON)にする」こと。
  • JSON(ジェイソン)は、プログラムがデータを読みやすくするためのルールだよ。
データを受け取る準備
  • resolve(data) で、データを返しているよ。
  • つまり、この関数を使えば 「ポケモンのデータを取ってこれる!」 ということ!

2ポケモンデータを使う (App コンポーネント)

import { useEffect } from 'react';
import './App.css';
import { getAllPokemon } from './utils/pokemon';

function App() {
  const initialURL = "https://pokeapi.co/api/v2/pokemon";

  useEffect(()=>{
    const fetchPokemonData = async () => {
      // 全てのポケモンデータを取得
      let res = await getAllPokemon(initialURL);
      console.log(res);
    };
    fetchPokemonData();
  },[]);

  return (
    <div className="App">
      
    </div>
  );
}

export default App;
App コンポーネントって何?

App は、ポケモンデータを取ってきて 「表示するための部品(コンポーネント)」 だよ!
Reactという仕組みを使って、Webページにデータを見せることができるよ。


useEffect とは?
useEffect(()=>{
    const fetchPokemonData = async () => {
      let res = await getAllPokemon(initialURL);
      console.log(res);
    };
    fetchPokemonData();
},[]);

useEffect は、「ページが開いたときにポケモンデータを取る」ために使うよ。

何が起こるの?
  1. useEffect が動くのは ページが開いたとき
  2. fetchPokemonData という関数が動く。
  3. fetchPokemonData の中で getAllPokemon(initialURL) を呼び出して、ポケモンデータを取ってくる。
  4. console.log(res); で、データを画面(開発ツールのコンソール)に表示する。

このプログラムの流れ

  1. 最初に App が開く(Webページが開く)。
  2. useEffect が動く(ポケモンデータを取りにいく)。
  3. getAllPokemon がAPIからデータを取る
  4. データを受け取って console.log(res); で表示!

まとめ

  • getAllPokemon はポケモンデータをもらう関数
  • App はデータをもらって表示するコンポーネント
  • useEffect を使ってページが開いたときにポケモンデータを取る
  • 最終的にポケモンデータが console.log で見える!

もっとわかりやすく例えると?

これは 「ポケモンずかんを見せるお店」 みたいなものだよ!

  1. getAllPokemon(url)「ポケモンを探しに行く店員さん」
  2. App「ポケモンずかんを見せるお店」
  3. useEffect「お客さん(ユーザー)が来たら、店員さんを動かす仕組み」

ポケモンずかんを見たい人が(Webページを開いたら)、店員さんがPokeAPIに行ってポケモンデータを取ってきてくれる! って感じだよ!


「もっとポケモンデータを画面に表示したい!」 と思ったら、console.log(res) の部分を div にデータを表示するようにするといいよ!

Step2-3:データ読み込み時のローディング設定

useStateと三項演算子を使ってローディングを設定

App.js

import { useEffect, useState } from 'react'; #追記 useStateを追加
import './App.css';
import { getAllPokemon } from './utils/pokemon';

function App() {
  const initialURL = "https://pokeapi.co/api/v2/pokemon";
  const [loading, setLoading] = useState(true); #追記

  useEffect(()=>{
    const fetchPokemonData = async () => {
      // 全てのポケモンデータを取得
      let res = await getAllPokemon(initialURL);
      console.log(res);
      setLoading(false); #追記
    };
    fetchPokemonData();
  },[]);

  return (
    <div className="App">
 
#以下追記 Trueであれば、?以降が実行され、Falseであれば:以降が実行される

      {loading ? (
        <h1>ロード中・・・</h1>
      ) : (
        <>
          <h1>ポケモンのデータを取得しました</h1>
        </>
      )}
    </div>
  );
}

export default App;

動作確認

読み込むデータが少ないので一瞬ですが、「ロード中・・・」という文字が表示されています。

小学生でも理解できるように説明してください。

ローディング設定について詳しく説明!

このプログラムは 「ポケモンのデータを取ってくるアプリ」 だよ!
でも、データをもらうのには ちょっと時間がかかる んだ。
だから、「データを待っている間に 「ロード中…」 って表示する仕組み」を作っているよ!


ローディングとは?

「ローディング」とは、データを取っている間に表示するメッセージ のこと!
たとえば、YouTube で動画を見ようとしたとき、ネットが遅いと 「くるくるマーク」 が出ることがあるよね?
それと同じで、ポケモンデータがまだ来ていないときに 「ロード中・・・」 を表示して、データが届いたら本当の情報を見せるようにしているよ。


ローディングの仕組みを作るためのポイント!

  1. データを取りに行く前は「ローディング中」にする
  2. データを取り終わったら「ローディングを終わらせる」
  3. 「ローディング中かどうか?」を loading という変数(state)で管理する

コードの中を見てみよう!

const [loading, setLoading] = useState(true);

🔹 useState(true) の意味

  • loading という変数を作って、最初は true(ロード中!) にしているよ。
  • setLoading という関数を使えば、loadingfalse に変えられるよ。

データを取ったあとに「ローディングを終わらせる」

useEffect(()=>{
  const fetchPokemonData = async () => {
    let res = await getAllPokemon(initialURL);
    console.log(res);
    setLoading(false); // データを取り終わったら「ローディング完了!」
  };
  fetchPokemonData();
},[]);

🔹 setLoading(false); の意味

  • setLoading(false);「ローディングを終わりにする」 ということ!
  • false にすると、ローディング画面じゃなくて、ポケモンデータを表示できるようになるよ。

「ロード中…」とポケモンデータの切り替え

return (
  <div className="App">
    {loading ? (
      <h1>ロード中・・・</h1>
    ) : (
      <>
        <h1>ポケモンのデータを取得しました</h1>
      </>
    )}
  </div>
);

🔹 {loading ? (...) : (...)} って何?
これは「もし loadingtrue なら 「ロード中・・・」を表示して、それ以外ならデータを見せる!」というルールだよ。

状態 (loading)画面に表示されるもの
true (ロード中)「ロード中・・・」
false (データ取得完了)「ポケモンのデータを取得しました」

ローディングの流れをおさらい!
  1. 最初は loading = true だから 「ロード中・・・」 が出る
  2. データを取りにいくgetAllPokemon を呼び出す)
  3. データが取れたら loading = false にする
  4. loading = false になると「ポケモンのデータを取得しました」が表示される!

もっとわかりやすく例えると?

これは 「料理を待つレストラン」 みたいなものだよ!

🍽 レストランの流れ

  1. お客さん(Webページ)が来る → 「ロード中・・・」 の札を出す
  2. 料理(ポケモンデータ)を作る(APIからデータを取る)
  3. 料理ができたら → 「ロード中・・・」を消して、料理(データ)を見せる!

だから、「料理ができるまでの時間=ローディング」 って考えるとわかりやすいね!🍜


まとめ
  • ローディングとは「データが来るまでの待機表示」のこと!
  • loading という変数で「待ってるかどうか?」を管理する
  • データが取れる前は loading = true(ロード中)、データが取れたら loading = false にする!
  • 「料理を待つレストラン」のような流れを考えるとイメージしやすい!

この仕組みを使うと、画面が「真っ白で何も出ない…」ってならないから、見る人が「今データを取ってるんだな!」って分かるようになるよ✨

-Apps