見出し画像

React Hooks + TypeScriptによるAPIデータ取得(axios + fetch):id

はじめに

React Hooks + TypeScriptによるAPIデータ取得(axios + fetch):idのアウトプットになります。
特定のidに紐づいたデータの取得をします。
前回はReact Hooks + TypeScriptによるAPIデータ取得(axios + fetch)の使い方を学習し、その続きになります。


学習に使用した教材・参考資料



ゴール

以下のようにテキストボックスに数字を入れてボタンを押すとidに紐づいたテキストを取得して表示できるようにします。
取得しているデータはここのオブジェクトのtitleを表示してます。


学習手順

  1. idを管理するステートを作る

  2. idの入力フォームとボタン、読み取るステートを作る

  3. 動作確認


ファイル構造

# react-sample-app -> react-ts-app -> src

src
├── App.css
├── App.test.tsx
├── App.tsx
├── components
│   ├── ApiFetch.tsx              <-- 編集
│   ├── Hello1.tsx
│   ├── Hello2.tsx
│   ├── BasicUseEffect.tsx
│   ├── Timer.tsx
│   └── TimerContainer.tsx
├── index.css
├── index.tsx
├── logo.svg
├── react-app-env.d.ts
├── reportWebVitals.ts
└── setupTests.ts


1. idを管理するステートを作る


以下のコードでconst [id, setId] = useState(1) を追加した。
取得したオブジェクトのidを管理するステートになる。
初期値を1で設定してある。

# ApiFetch.tsx

import React, {useState、useEffect} from 'react'
//import axios from 'axios';


const ApiFetch = () => {
    
    const [posts, setPosts] = useState<any>([])
    const [id, setId] = useState(1)      //<-- 追加

        
    

    // useEffect(() => {
        // axios.get('https://jsonplaceholder.typicode.com/posts')
        // .then(res => {
        //     setPosts(res.data)   
        // })

      fetch(`https://jsonplaceholder.typicode.com/posts/${id}`, {method: "GET"})
        .then(res => res.json())
        .then(data => {
            setPosts(data);
        })

    // },[]);
    

  return (
    <div>
        <ul>
            {
                posts.map(post => <li key={post.id}>{post.title}</li>)
            }
        </ul>
    </div>
  )
}

export default ApiFetch


2. idの入力フォームとボタン、読み取るステートを作る


以下のコードにconst [clicked, setClicked] = useState(false)を追加してボタンをクリックしたことを読み取るステートを作る。
`https://jsonplaceholder.typicode.com/posts/${id}`を編集するシングルクォーとをバッククォートに変えて${}に表示したいオブジェクトの変数を入れる。
配列で表示はさせないので、<ul></ul>をコメントアウトする。
idの入力インプットが必要なので<input type='text' value={id} onChange={(evt=>setId(Number(evt.target.value)))} />を追加する。
入力したidをボタンを押すことで実行できるように、<button type='button' onClick={handlerClicked}>Get post</button>  ボタンを追加する。
ボタンを実行できるようにする為の関数const handlerClicked = () =>{}を定義する。関数内にfetchメソッドを移動させると、ボタンをクリックするとidに紐づいたオブジェクトを取得することができる。
取得した<title>を表示させたいので、{posts.title} を埋め込む。

# ApiFetch.tsx

import React, {useState、useEffect} from 'react'
//import axios from 'axios';


const ApiFetch = () => {
    
    const [posts, setPosts] = useState<any>([])
    const [id, setId] = useState(1)      
    const [clicked, setClicked] = useState(false)    //<-- 追加
        
    const handlerClicked = () => {    //<-- 追加
        setClicked(!clicked)
        fetch(`https://jsonplaceholder.typicode.com/posts/${id}`, {method: "GET"})    //<--編集
        .then(res => res.json())
        .then(data => {
            setPosts(data);
      
    }

    // useEffect(() => {
        // axios.get('https://jsonplaceholder.typicode.com/posts')
        // .then(res => {
        //     setPosts(res.data)   
        // })

      
        })

    // },[]);
    

  return (
    <div>
              <input type='text' value={id} onChange={(evt=>setId(Number(evt.target.value)))} />  //<-- 追加
        <br />
        <button type='button' onClick={handlerClicked}>Get post</button>    //<-- 追加
        <br />
        {posts.title}    //<-- 追加
        {/* <ul>
            {
                posts.map(post => <li key={post.id}>{post.title}</li>)
            }
        </ul> */}
    </div>
  )
}

export default ApiFetch


3. 動作確認


localhost:3000に接続して、以下のように数字を入力してボタンを押すとオブジェクトのtitleが表示されればとりあえず成功。

おわりに

React Hooks + TypeScriptによるAPIデータ取得(axios + fetch):idの学習でした。
次回はuseContext コンセプトになります。

この記事が気に入ったらサポートをしてみませんか?