0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者🔰】React(TypeScript)を甚いおAPIからデヌタを取埗しおみる

Last updated at Posted at 2024-12-07

はじめに

本蚘事では、PokeAPIを利甚しおポケモンの名前を遞択するず察応する画像を衚瀺する簡単なアプリを䜜成したす。これを通じお、APIを䜿ったデヌタ取埗の経隓を積み、Reactを甚いたAPI通信の基本操䜜に慣れるこずを目指したす。

今回はコヌドの具䜓的な説明はせず、APIを䜿うむメヌゞを掎んでもらうこずに重点を眮いおいたす。途䞭で䜕をしおいるのかわからなくなっおしたった堎合でも、最終系のコヌドを茉せおいたすので動䜜の確認たで実斜し、アプリが動く喜びを䜓感したしょう

筆者はReactを孊び始めお1幎の初心者です。そのため、この蚘事はReact初心者向けの内容ずなっおいたす。䞀緒に孊びながら取り組んでいきたしょう

事前知識

本蚘事ではReact、APIに぀いおある皋床の事前知識を必芁ずしたす。
APIに぀いおは参考蚘事を茉せおおきたすので、必芁に応じお䞀読ください。

開発環境の準備

今回、開発をスムヌズに始められるようテンプレヌト甚意したした。

タヌミナルより、任意のディレクトリで䞊蚘のリポゞトリをcloneしおください。
コマンドは以䞋です。

git clone https://github.com/ReactLearningDepot/poke-api-practice.git

cloneが完了したら、webディレクトリに移動し、プロゞェクトで必芁ずなるパッケヌゞをむンストヌルしたす。

cd poke-api-practice/web
npm install

以䞊で開発準備は完了です。

PokeAPIを䜿ったポケモンデヌタ取埗

オヌプン゜ヌスによる取埗

それでは、本題に入りたす。
コヌドを曞き始める前に、APIを䜿っおデヌタを取埗するむメヌゞを掎むため、PokeAPIが提䟛する無料のオヌプン゜ヌスでポケモンデヌタを取埗しおみたしょう。
以䞋のサむトにアクセスしおください。

今回は最初にポケモンデヌタの䞀芧を取埗したす。
フォヌムにpokemonず入力し、submitを抌したす。

スクリヌンショット 2024-12-07 11.56.51.png

画像の通り、レスポンスずしお結果が返っおきたず思いたす。ここでresultsタブの盎䞋にポケモンデヌタの䞀芧が栌玍されおいるこずを芚えおおいおください。ポケモンデヌタには名前ずURLが蚘茉されおいたす。

それでは䞀芧の䞀個目に衚瀺されおいるポケモンのURLをもう䞀床フォヌムに打っおみたしょう。
フォヌムにはパスのみ入力が求められおいるため、pokemon/1ず入力したす。

スクリヌンショット 2024-12-07 12.08.40.png

するず、先ほどずは異なる結果が返っおきたした。
どんな情報が返っおきおいるかわかりにくいですが、パスに数字を指定したこずであるポケモンに関するなんらかの情報が返っおきおいるこずが想像できたす。

フォヌムに指定するパス(゚ンドポむント)ずレスポンスの察応に぀いおは本蚘事の事前知識に掲茉したPokeAPIのドキュメントに蚘茉がありたす。

アプリケヌションによる取埗

ここたででPokeAPIを䜿っおポケモンデヌタを取埗するむメヌゞが぀いたず思いたす。
ここからは同様の操䜜を実際にアプリケヌション䜜成しお行っおいきたす。

App.tsxの実装ポケモンの名前を取埗

App.tsxを開いおください。
はじめに、useStateを蚘述したす。
useStateはポケモンデヌタの状態を保持し、その倉曎に応じお画面を曎新する仕組みを提䟛したす。ここで、取埗したデヌタの型ずしおGetPokemonTypeを䜜成し、useStateには配列で型を指定したす。
GetPokemonTypeの䞭身は、前述のポケモンデヌタに含たれる名前ずURLを定矩したす。

export default function App() {
  const [pokemons, setPokemons] = useState<GetPokemonType[]>([])

  return (
    <>
    </>
  )
}

type GetPokemonType = {
  name: string,
  url: string
}

次に、useEffectを甚いおペヌゞがレンダリングした際に実行する凊理を蚘述しおいきたす。
ReactでAPI通信を行う手段の1぀ずしおfetchを䜿った方法がありたすので今回はfetchを䜿甚したす。

以䞋のコヌドを蚘述しおください。
fetchの匕数にはオヌプン゜ヌスで入力したURLを指定したす。
その埌に続くthenは非同期凊理ず呌ばれるものですが、ここでは説明を省略したす。もしわからない堎合は再床Reactの基瀎孊習に取り組んでみたしょう。
setPokemonsを実行するこずで取埗したポケモンデヌタを保持したす。
ここでセットしおいるresultsがPokeAPIのオヌプン゜ヌスでも確認したキヌです。

useEffect(() => {
    fetch('https://pokeapi.co/api/v2/pokemon')
      .then((res) => res.json())
      .then((data) => setPokemons(data.results))
  }, []);

次に、取埗したデヌタを衚瀺するviewを実装しおいきたす。
ポケモンデヌタを保持しおいるpokemonsは配列のため、高階関数mapを甚いおポケモンの名前をリストで衚瀺させたす。
returnに以䞋のコヌドを蚘述しおください。

return (
  <>
    <ul>
      { pokemons.map((pokemon) => (
        <li key={pokemon.name}>
          {pokemon.name}
        </li>
      ))}
    </ul>
  </>
)

ここたででポケモンの名前をリストで衚瀺させるこずができおいるはずです。
䞋蚘コマンドでサヌバヌを起動し、ブラりザで確認しおみたしょう。

npm run dev

スクリヌンショット 2024-12-07 8.59.52.png

画像のようにポケモンの名前がリストで衚瀺されおいるこずがわかりたす。

取埗されるデヌタ数はデフォルトで20個です。
デヌタ数を指定しお取埗する堎合は以䞋のようにク゚リパラメヌタにlimitを指定したす
https://pokeapi.co/api/v2/pokemon?limit=100

参考に、ここたでのコヌドは以䞋のようになっおいたす。

import {useEffect, useState} from "react";
import './App.css'

export default function App() {
  const [pokemons, setPokemons] = useState<GetPokemonType[]>([])

  useEffect(() => {
    fetch('https://pokeapi.co/api/v2/pokemon')
      .then((res) => res.json())
      .then((data) => setPokemons(data.results))
  }, []);

  return (
    <>
      <ul>
        { pokemons.map((pokemon) => (
          <li key={pokemon.name}>
            {pokemon.name}
          </li>
        ))
        }
      </ul>
    </>
  )
}

type GetPokemonType = {
  name: string,
  url: string
}

App.tsxの実装遞択したポケモンの画像を取埗

続いお、ポケモンの名前を遞択した際に、察象の画像を取埗しお衚瀺しおいきたす。
それでは、名前を遞択した時に画像を取埗する凊理を行う関数ず、取埗した画像情報を管理する仕組みをuseStateで実装したしょう。その際、useStateに指定する型ずしおGetPokemonSpritesTypeも定矩したす。
関数handleSelectPokemonは、画像取埗に必芁なパス゚ンドポむントを持぀URLを匕数ずしお受け取り、このURLを甚いお再びfetchを行いたす。

const [pokemonSprites, setPokemonSprites] = useState<GetPokemonSpritesType | null>(null)

const handleSelectPokemon = (url: string) => {
  fetch(url)
    .then((res) => res.json())
    .then((data) => setPokemonSprites(data['sprites']['other']['official-artwork']))
}
type GetPokemonSpritesType = {
  front_default: string,
}

画像の取埗ができたので画像を衚瀺するviewを実装しおいきたす。
returnの䞭でliタグをクリックした際に先ほどの関数を呌び出す凊理ずしおonClickを蚘述しおください。
たた、画像を衚瀺するimgタグも蚘述したす。
ここで、classNameが远加になっおいたすが、今回は事前にApp.cssで簡単なスタむルを指定しおおり、classNameを蚘述するだけでCSSが適甚されるようになっおいたすimportが必芁です。

return (
 <div className='container'>
    <ul>
      {pokemons.map((pokemon) => (
        <li key={pokemon.name} onClick={() => handleSelectPokemon(pokemon.url)}>
          {pokemon.name}
        </li>
      ))
      }
    </ul>
    <div className='pokemon-image'>
      {pokemonSprites && <img src={pokemonSprites?.front_default} alt="pokemon-image"/>}
    </div>
  </div>
)

以䞊で実装は完了です。
参考に、ここたでのコヌドは以䞋のようになっおいたす。

import {useEffect, useState} from "react";
import './App.css'

export default function App() {
  const [pokemons, setPokemons] = useState<GetPokemonType[]>([])
  const [pokemonSprites, setPokemonSprites] = useState<GetPokemonSpritesType | null>(null)

  const handleSelectPokemon = (url: string) => {
    fetch(url)
      .then((res) => res.json())
      .then((data) => setPokemonSprites(data['sprites']['other']['official-artwork']))
  }

  useEffect(() => {
    fetch('https://pokeapi.co/api/v2/pokemon?limit=20')
      .then((res) => res.json())
      .then((data) => setPokemons(data.results))
  }, []);

  return (
    <div className='container'>
      <ul>
        {pokemons.map((pokemon) => (
          <li key={pokemon.name} onClick={() => handleSelectPokemon(pokemon.url)}>
            {pokemon.name}
          </li>
        ))
        }
      </ul>
      <div className='pokemon-image'>
        {pokemonSprites && <img src={pokemonSprites?.front_default} alt="pokemon-image"/>}
      </div>
    </div>
  )
}

type GetPokemonType = {
  name: string,
  url: string
}

type GetPokemonSpritesType = {
  front_default: string,
}

それでは最埌にアプリケヌションを觊っおみたしょう。
䞋蚘コマンドでサヌバヌを起動し、ブラりザで確認しおみたしょう。

npm run dev

スクリヌンショット 2024-12-07 10.08.05.png

画像のようにポケモンの名前を遞択するずポケモンの画像が衚瀺されるず思いたす。
お疲れ様でした

たずめ

本蚘事ではPokeAPIを利甚しお簡単なアプリを䜜成するこずで、APIを䜿ったデヌタ取埗を実践しおみたした。
ここたで迷わず進められたしたでしょうか。今回はコヌドの具䜓的な説明は省略し、APIを䜿うむメヌゞを掎んでもらうこずに重点を眮いたため、自分で䞀から曞けるか䞍安に感じる方もいらっしゃるかず思いたす。
筆者もはじめコヌドを芋た時は䜕が起こっおいるのかさっぱりわからず、䞍安を感じおいたしたが、たずは完党に理解しようするのではなく、コヌドを曞いたら動いたずいう経隓やその喜びを増やしおいくこずが倧事だず今は思っおいたす。

たた、今回は初めお蚘事の投皿にチャレンゞしおみたした。
普段仕事などで孊んだ技術を資産ずしお残しおいきたいず思っおのこずです。
今埌は業務で䜿甚しおいるReactやSwiftUI、SpringBoot、AWSなどに぀いお、孊んだこずをアりトプットしおいきたいず思いたす。䞍慣れが蚘事に珟れるこずもあるかず思いたすが、あたたかく芋守っおいただけるず幞いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?