<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ AXIOS - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ エキスパートの手によるプログラミングチュートリアル記事を幅広く掲載。ウェブ開発、データサイエンス、DevOps、セキュリティ、開発者としてのキャリアなどについて学びましょう。 ]]>
        </description>
        <link>https://www.freecodecamp.org/japanese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ AXIOS - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/japanese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 31 May 2026 04:46:43 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/japanese/news/tag/axios/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ JavaScript でよく使われる HTTP リクエスト実行方法 ]]>
                </title>
                <description>
                    <![CDATA[ JavaScript には HTTP リクエストを実行できる優れたモジュールやメソッドがあり、サーバー側のリソースにデータを送受信するために使えます。この記事では、JavaScript で HTTP リクエストを実行する方法のうち、よく使われるものをいくつか紹介します。 Ajax Ajax は非同期の HTTP リクエストを行う古典的な方法です。データは HTTP POST メソッドを使って送信され、HTTP GET メソッドを使って受信されます。GET リクエストの実行方法を見てみましょう。ここでは、ランダムなデータを JSON 形式で返してくれる、開発者向け無料オンライン REST API「JSONPlaceholder」を使用します。 Ajax で HTTP リクエストを実行するには、まず XMLHttpRequest() で新しくオブジェクトを初期化して、次に URL エンドポイントと HTTP メソッド (この例では GET) を指定します。最後に、open() メソッドを使って HTTP メソッドと URL エンドポイントを結び付け、 send() メソッドを呼び出して ]]>
                </description>
                <link>https://www.freecodecamp.org/japanese/news/here-is-the-most-popular-ways-to-make-an-http-request-in-javascript-954ce8c95aaa/</link>
                <guid isPermaLink="false">63f218ce721fc106335f1a2a</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ HTTP ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Ajax ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Angular ]]>
                    </category>
                
                    <category>
                        <![CDATA[ AXIOS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ jQuery ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ まつだようこ ]]>
                </dc:creator>
                <pubDate>Mon, 20 Feb 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_gqHgCNubMncv7EwWNdArGQ.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文:</strong> <a href="https://www.freecodecamp.org/news/here-is-the-most-popular-ways-to-make-an-http-request-in-javascript-954ce8c95aaa/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Here are the most popular ways to make an HTTP request in JavaScript</a>
      </p><p>JavaScript には HTTP リクエストを実行できる優れたモジュールやメソッドがあり、サーバー側のリソースにデータを送受信するために使えます。この記事では、JavaScript で HTTP リクエストを実行する方法のうち、よく使われるものをいくつか紹介します。</p><h3 id="ajax">Ajax</h3><p>Ajax は非同期の HTTP リクエストを行う古典的な方法です。データは HTTP POST メソッドを使って送信され、HTTP GET メソッドを使って受信されます。<code>GET</code> リクエストの実行方法を見てみましょう。ここでは、ランダムなデータを JSON 形式で返してくれる、開発者向け無料オンライン REST API「JSONPlaceholder」を使用します。</p><p>Ajax で HTTP リクエストを実行するには、まず <code>XMLHttpRequest()</code> で新しくオブジェクトを初期化して、次に URL エンドポイントと HTTP メソッド (この例では GET) を指定します。最後に、<code>open()</code> メソッドを使って HTTP メソッドと URL エンドポイントを結び付け、<code>send()</code> メソッドを呼び出してリクエストを実行します。</p><p>この例では <code>XMLHTTPRequest.onreadystatechange</code> プロパティを使用して、HTTP レスポンスをコンソールログに出力します。このプロパティには <code>readystatechange</code> イベントが発生した時に呼び出されるイベントハンドラーを含めます。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_zXtlRe4yRF3tZkFFvBhZeA.png" class="kg-image" alt="1_zXtlRe4yRF3tZkFFvBhZeA" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_zXtlRe4yRF3tZkFFvBhZeA.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_zXtlRe4yRF3tZkFFvBhZeA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="349" loading="lazy"></figure><pre><code class="language-js">const Http = new XMLHttpRequest();
const url='https://jsonplaceholder.typicode.com/posts';
Http.open("GET", url);
Http.send();

Http.onreadystatechange = (e) =&gt; {
  console.log(Http.responseText)
}
</code></pre><p>ブラウザーコンソールを確認すると、データの配列が JSON 形式で返されているのが分かります。では、リクエストが完了したかどうかを知るにはどうしたらいいのでしょうか？言い換えれば、Ajax でレスポンスを扱うにはどのようにしたらいいのでしょうか。</p><p><code>onreadystatechange</code> プロパティには <code>readyState</code> と <code>status</code> という 2 つのメソッドがあります。これを使ってリクエストの状態が確認できます。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_UfZf6qaZwNh5Mptft4WIZA.png" class="kg-image" alt="1_UfZf6qaZwNh5Mptft4WIZA" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_UfZf6qaZwNh5Mptft4WIZA.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_UfZf6qaZwNh5Mptft4WIZA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="376" loading="lazy"></figure><p><code>readyState</code> が 4 の場合は、リクエストが完了したことを意味します。<code>readyState</code> プロパティには 5 種類のレスポンスがあります。<a href="https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest/readyState">詳しくはこちら</a>を参照してください。</p><p>JavaScript で直接 Ajax を呼び出す以外にも、HTTP 呼び出しの実行に便利なメソッドには、jQuery メソッドの <code>$.Ajax</code> などがあります。次はそちらを紹介します。</p><h3 id="jquery-">jQuery メソッド</h3><p>jQuery には HTTP リクエストの扱いを楽にする多くのメソッドがあります。このメソッドを使えるようにするには、プロジェクトに jQuery ライブラリを追加します。</p><pre><code class="language-html">&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;
</code></pre><h4 id="-ajax">$.ajax</h4><p>jQuery Ajax は、HTTP 呼び出しを行う最もシンプルなメソッドの一つです。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_vZ4BqVQfsvtpJm_RCsCE2Q.png" class="kg-image" alt="1_vZ4BqVQfsvtpJm_RCsCE2Q" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_vZ4BqVQfsvtpJm_RCsCE2Q.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_vZ4BqVQfsvtpJm_RCsCE2Q.png 800w" sizes="(min-width: 720px) 720px" width="800" height="429" loading="lazy"></figure><p><code>$.ajax</code> メソッドには多くのパラメーターが指定でき、必須の物もそうでない物もあります。その中には、受け取ったレスポンスを扱うための <code>success</code> と <code>error</code> という 2 種類のコールバックオプションがあります。</p><h4 id="-get-">$.get メソッド</h4><p><code>$.get</code> メソッドは、GET リクエストを実行するために使われます。このメソッドは 2 つのパラメーターを受け付けます。エンドポイント (URL) と、コールバック関数です。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_2koN5FJuT68WIyRKTihe5w.png" class="kg-image" alt="1_2koN5FJuT68WIyRKTihe5w" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_2koN5FJuT68WIyRKTihe5w.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_2koN5FJuT68WIyRKTihe5w.png 797w" sizes="(min-width: 720px) 720px" width="797" height="287" loading="lazy"></figure><h4 id="-post">$.post</h4><p><code>$.post</code> メソッドはサーバーにデータを POST する方法です。これは 3 つのパラメーターを受け付けます。URL、POST したいデータ、そしてコールバック関数です。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_ql6Yp1EJfD7850GXhErwyw.png" class="kg-image" alt="1_ql6Yp1EJfD7850GXhErwyw" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_ql6Yp1EJfD7850GXhErwyw.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_ql6Yp1EJfD7850GXhErwyw.png 695w" width="695" height="355" loading="lazy"></figure><h4 id="-getjson">$.getJSON</h4><p><code>$.getJSON</code> メソッドは、JSON 形式のデータのみを取得します。これは 2 つのパラメーターを受け付けます。URL とコールバック関数です。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_hdcFdVHiBiRAo1YOi_Kt0Q.png" class="kg-image" alt="1_hdcFdVHiBiRAo1YOi_Kt0Q" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_hdcFdVHiBiRAo1YOi_Kt0Q.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_hdcFdVHiBiRAo1YOi_Kt0Q.png 755w" sizes="(min-width: 720px) 720px" width="755" height="291" loading="lazy"></figure><p>jQuery にはこのように、リモートサーバーにデータを要求したり送信したりする各種メソッドが備わっています。しかし、これらのメソッドは実は <code>$.ajax</code> メソッドだけで実行できます。その例が下記です。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_soPARjfQXMcZ5ccPK1QMmA.png" class="kg-image" alt="1_soPARjfQXMcZ5ccPK1QMmA" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_soPARjfQXMcZ5ccPK1QMmA.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_soPARjfQXMcZ5ccPK1QMmA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="420" loading="lazy"></figure><h3 id="fetch">fetch</h3><p><code>fetch</code> は、非同期リクエストを実行できる新しい強力なウェブ API です。実のところ、HTTP リクエストの方法としてベストな、筆者のお気に入りでもある方法の 1 つが <code>fetch</code> です。<code>fetch</code> は、ES6 の特徴である「プロミス」を返します。ES6 に馴染みがないなら、<a href="https://www.freecodecamp.org/news/write-less-do-more-with-javascript-es6-5fd4a8e50ee2">こちらの記事 (英語)</a> で詳しく解説していますので参考にしてください。プロミスを使うと、非同期リクエストをスマートに扱うことができます。では <code>fetch</code> がどのように動作するか見ていきましょう。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_kz6k4VRs0RiVCasWR0pCow.png" class="kg-image" alt="1_kz6k4VRs0RiVCasWR0pCow" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_kz6k4VRs0RiVCasWR0pCow.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_kz6k4VRs0RiVCasWR0pCow.png 800w" sizes="(min-width: 720px) 720px" width="800" height="270" loading="lazy"></figure><p><code>fetch</code> 関数は、1 つ必須のパラメーターとしてエンドポイントの URL をとります。その他にも下記の例のように、オプションのパラメーターがあります。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_QasrBgYZcU4BBFHqD2bBdg.png" class="kg-image" alt="1_QasrBgYZcU4BBFHqD2bBdg" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_QasrBgYZcU4BBFHqD2bBdg.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_QasrBgYZcU4BBFHqD2bBdg.png 800w" sizes="(min-width: 720px) 720px" width="800" height="497" loading="lazy"></figure><p><code>fetch</code> には多くの利点があります。<a href="https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch">詳しくはこちら</a>を参照してください。また、fetch の他にもサーバーへのリクエスト送受信を可能にするモジュールやプラグインがあります。例えば <a href="https://github.com/axios/axios">Axios</a> です。</p><h3 id="axios">Axios</h3><p>Axios は、HTTP リクエストを実行するためのオープンソースのライブラリで、たくさんの便利な機能を備えています。使い方を見ていきましょう。</p><h4 id="-">使用方法:</h4><p>まず、Axios を追加します。プロジェクトに Axios を追加する方法は 2 種類あります。</p><p>1 つ目は、npm を使う方法です。</p><pre><code class="language-bash">npm install axios --save
</code></pre><p>上記コマンドを実行後、Axios をインポートします。</p><pre><code class="language-js">import axios from 'axios'
</code></pre><p>2 つ目は、CDN を使って Axios を追加する方法です。</p><pre><code class="language-html">&lt;script src="https://unpkg.com/axios/dist/axios.min.js"&gt;&lt;/script&gt;
</code></pre><h4 id="axios-">Axios でリクエストを実行する:</h4><p>Axios でサーバーに対してデータの送受信を行うには <code>GET</code> と <code>POST</code> を使用します。</p><h4 id="get-">GET:</h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_4wmqiPsSN5mdgjJiRaKVZg.png" class="kg-image" alt="1_4wmqiPsSN5mdgjJiRaKVZg" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_4wmqiPsSN5mdgjJiRaKVZg.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_4wmqiPsSN5mdgjJiRaKVZg.png 781w" sizes="(min-width: 720px) 720px" width="781" height="440" loading="lazy"></figure><p><code>axios</code> は 1 つの必須パラメーターと、オプションで 2 つ目のパラメーターを取ることができます。上の例ではシンプルなクエリーのデータを渡しています。</p><h4 id="post-">POST:</h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_ey6-vwsrm9RAhyoU15u6xQ.png" class="kg-image" alt="1_ey6-vwsrm9RAhyoU15u6xQ" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_ey6-vwsrm9RAhyoU15u6xQ.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_ey6-vwsrm9RAhyoU15u6xQ.png 755w" sizes="(min-width: 720px) 720px" width="755" height="412" loading="lazy"></figure><p><a href="https://github.com/axios/axios">Axios</a> は「プロミス」を返します。プロミスについて詳しい人は、プロミスを使うと複数のリクエストを実行できることをご存じかもしれません。Axios でも同じように、複数のリクエストを同時に実行できます。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_40Pji4utVKPpC7-dePfC6Q.png" class="kg-image" alt="1_40Pji4utVKPpC7-dePfC6Q" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_40Pji4utVKPpC7-dePfC6Q.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_40Pji4utVKPpC7-dePfC6Q.png 800w" sizes="(min-width: 720px) 720px" width="800" height="396" loading="lazy"></figure><p>Axios では他にも多くのメソッドやオプションがサポートされています。<a href="https://github.com/axios/axios">こちら</a>を参照してください。</p><h3 id="angular-httpclient">Angular HttpClient</h3><p>Angular には、Angular アプリで動作する独自の HTTP モジュールがあります。非同期リクエストの処理には <a href="http://reactivex.io/rxjs/">RxJS</a> ライブラリが使用され、HTTP リクエストを実行するための多数のオプションが提供されています。</p><h4 id="angular-httpclient-">Angular HttpClient を使用してサーバーと通信する</h4><p>Angular HttpClient を使用してリクエストを実行するには、Angular アプリ内でコードを実行する必要があります。そのためのサンプルアプリを作成しました (訳注: リンクは後述)。Angular に詳しくない方は、筆者の記事 <a href="https://www.freecodecamp.org/news/learn-how-to-create-your-first-angular-app-in-20-min-146201d9b5a7">Learn how to create your first Angular app in 20 minutes</a> を参考にしてください。</p><p>まず、<code>app.module.ts</code> で <code>HttpClientModule</code> をインポートします。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_iFuW5Fbp91VR5gwQ6XNMEQ.png" class="kg-image" alt="1_iFuW5Fbp91VR5gwQ6XNMEQ" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_iFuW5Fbp91VR5gwQ6XNMEQ.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_iFuW5Fbp91VR5gwQ6XNMEQ.png 758w" sizes="(min-width: 720px) 720px" width="758" height="632" loading="lazy"></figure><p>次に、リクエストを扱うためのサービスを作成します。<a href="https://cli.angular.io/">Angular CLI</a> を使用すれば、簡単にサービスを生成できます。</p><pre><code class="language-bash">ng g service  FetchdataService
</code></pre><p>次に、<code>fetchdataService.ts</code> サービスで HttpClient をインポートし、コンストラクターで注入 (inject) します。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_kKwELAhSSpnN8DvIgdOfcQ.png" class="kg-image" alt="1_kKwELAhSSpnN8DvIgdOfcQ" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_kKwELAhSSpnN8DvIgdOfcQ.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_kKwELAhSSpnN8DvIgdOfcQ.png 685w" width="685" height="461" loading="lazy"></figure><p>そして <code>app.component.ts</code> で <code>fetchdataService</code> をインポートします。</p><pre><code class="language-ts">//import
import { FetchdataService } from './fetchdata.service';
</code></pre><p>最後に、サービスを呼び出して実行します。</p><p><code>app.component.ts:</code></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_OrRe183Yaclt19n5ZQ194Q.png" class="kg-image" alt="1_OrRe183Yaclt19n5ZQ194Q" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2023/02/1_OrRe183Yaclt19n5ZQ194Q.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2023/02/1_OrRe183Yaclt19n5ZQ194Q.png 788w" sizes="(min-width: 720px) 720px" width="788" height="620" loading="lazy"></figure><p>サンプルアプリのデモは <a href="https://stackblitz.com/edit/angular-httpclinent">Stackblitz</a> で確認できます。</p><h3 id="--1">まとめ</h3><p>この記事では、JavaScript における HTTP リクエストの実行方法で最もよく使われる物を見てきました。</p><p>ここまでお読みいただきありがとうございました。この記事を気に入っていただけましたら筆者の <a href="https://twitter.com/SaidHYN">Twitter</a> までご連絡ください。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ React、React Hooks、Axios を用いて CRUD 操作を実行する方法 ]]>
                </title>
                <description>
                    <![CDATA[ React を扱っていれば、API リクエストを理解し実装するのはとても難しいと感じられるでしょう。 そこでこの記事では、React 、React Hooks、React Router、Axios を用いて CRUD 操作を実装することにより、そのすべてがどのように機能するかを学んでいきます。 さあはじめましょう。 Node と npm をインストールする方法 まず最初に、Node をシステム内にインストールしましょう。私たちは主にそれを用いて JavaScript のコードを実行します。 Node をダウンロードするには、https://nodejs.org/en/ にアクセスしてください。 Node上に構築された Node パッケージマネージャー (npm) も必要です。それを用いることで、JavaScript アプリ用のパッケージをインストールできます。幸い、npm は Node に備わっているため、個別にダウンロードする必要はありません。 両方のダウンロードが終了したら、ターミナルかコマンドプロンプトを開いて、node -v と入力してみましょう。これでダウンロード ]]>
                </description>
                <link>https://www.freecodecamp.org/japanese/news/how-to-perform-crud-operations-using-react/</link>
                <guid isPermaLink="false">61f13a510e2ac404be7310fd</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                    <category>
                        <![CDATA[ AXIOS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Manabu Matsumoto ]]>
                </dc:creator>
                <pubDate>Sun, 06 Mar 2022 23:45:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/japanese/news/content/images/2022/01/React-CRUD-Operations-using-React-and-React-Hooks.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文:</strong> <a href="https://www.freecodecamp.org/news/how-to-perform-crud-operations-using-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Perform CRUD Operations using React, React Hooks, and Axios</a>
      </p><p>React を扱っていれば、API リクエストを理解し実装するのはとても難しいと感じられるでしょう。</p><p>そこでこの記事では、React 、React Hooks、React Router、Axios を用いて CRUD 操作を実装することにより、そのすべてがどのように機能するかを学んでいきます。</p><p>さあはじめましょう。</p><h2 id="node-npm-"><strong>Node と npm をインストールする方法</strong></h2><p>まず最初に、Node をシステム内にインストールしましょう。私たちは主にそれを用いて JavaScript のコードを実行します。</p><p>Node をダウンロードするには、<a href="https://nodejs.org/en/">https://nodejs.org/en/</a> にアクセスしてください。</p><p>Node上に構築された <strong>Node パッケージマネージャー</strong> (npm) も必要です。それを用いることで、JavaScript アプリ用のパッケージをインストールできます。幸い、npm は Node に備わっているため、個別にダウンロードする必要はありません。</p><p>両方のダウンロードが終了したら、ターミナルかコマンドプロンプトを開いて、<code>node -v</code> と入力してみましょう。これでダウンロードした Node のバージョンを確認します。</p><h2 id="react-"><strong>React アプリケーションを作成する方法</strong></h2><p>次に、React アプリケーションを作成するには、ターミナル内で <code><strong><strong>npx create-react-app &lt;Your app name&gt;</strong></strong></code> と入力しますが、今回は <code>npx create-react-app react-crud</code> と入力します。</p><p>そうすると、パッケージのインストール状態が表示されます。</p><p>パッケージのインストールが終わったら、プロジェクトフォルダーへ移動して、<code>npm start</code> と入力します。</p><p>すると、次のような初期状態の React テンプレートが表示されます:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screenshot-2021-07-24-124754.png" class="kg-image" alt="Screenshot-2021-07-24-124754" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/Screenshot-2021-07-24-124754.png 600w, https://www.freecodecamp.org/japanese/news/content/images/size/w1000/2022/01/Screenshot-2021-07-24-124754.png 1000w, https://www.freecodecamp.org/japanese/news/content/images/size/w1600/2022/01/Screenshot-2021-07-24-124754.png 1600w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screenshot-2021-07-24-124754.png 1846w" sizes="(min-width: 720px) 720px" width="1846" height="903" loading="lazy"><figcaption>初期状態の React テンプレート</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screenshot-2021-07-24-124858.png" class="kg-image" alt="Screenshot-2021-07-24-124858" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/Screenshot-2021-07-24-124858.png 600w, https://www.freecodecamp.org/japanese/news/content/images/size/w1000/2022/01/Screenshot-2021-07-24-124858.png 1000w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screenshot-2021-07-24-124858.png 1117w" sizes="(min-width: 720px) 720px" width="1117" height="670" loading="lazy"><figcaption>App.js ファイル</figcaption></figure><h2 id="react-semantic-ui-"><strong>React 用の Semantic UI パッケージをインストールする方法</strong></h2><p>次に、Semantic UI React パッケージをインストールしましょう。Semantic UI は、React 用に作られた UI (ユーザーインターフェース) ライブラリーです。Semantic UI には、テーブル、ボタンなどの機能をもつ多くの UI コンポーネントが、あらかじめ構築されています。</p><p>以下のコマンドを、ご自身のパッケージマネージャーに応じて入力すれば、Semantic UI をインストールできます。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">yarn add semantic-ui-react semantic-ui-css
</code></pre><figcaption>Yarn パッケージマネージャー用のコマンド</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-bash">npm install semantic-ui-react semantic-ui-css
</code></pre><figcaption>NPM パッケージマネージャー用のコマンド</figcaption></figure><p>また、アプリケーションのメインエントリーファイルである index.js に、インストールしたライブラリーをインポートします。</p><figure class="kg-card kg-code-card"><pre><code class="language-js">import 'semantic-ui-css/semantic.min.css'
</code></pre><figcaption>こちらを index.js ファイル内へ貼り付けてください</figcaption></figure><h2 id="crud-"><strong>CRUD アプリケーションを構築する方法</strong></h2><p>では、React を用いて CRUD アプリケーションの構築を始めましょう。</p><p>最初に、アプリケーションにヘッダーを追加しましょう。</p><p>以下のようにして、App.js ファイル内にヘッダーを追加します:</p><figure class="kg-card kg-code-card"><pre><code>import './App.css';

function App() {
  return (
    &lt;div&gt;
      React Crud Operations
    &lt;/div&gt;
  );
}

export default App;
</code></pre><figcaption>アプリケーションにヘッダーを追加</figcaption></figure><p>次に、ヘッダーを中央に配置しましょう。</p><p>親要素 div の、className 属性の値を main に設定してください。それから、App.css ファイル内でフレックスボックスを使用して、ヘッダーを中央に配置しましょう。</p><figure class="kg-card kg-code-card"><pre><code>import './App.css';

function App() {
  return (
    &lt;div className="main"&gt;
      React Crud Operations
    &lt;/div&gt;
  );
}

export default App;
</code></pre><figcaption>App.js の中で 親要素 div の className 属性の値を main に設定</figcaption></figure><figure class="kg-card kg-code-card"><pre><code>.main{
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background-color: #212121;
  color: whitesmoke;
}
</code></pre><figcaption>App.css ファイル</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screenshot-2021-07-24-130340.png" class="kg-image" alt="Screenshot-2021-07-24-130340" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/Screenshot-2021-07-24-130340.png 600w, https://www.freecodecamp.org/japanese/news/content/images/size/w1000/2022/01/Screenshot-2021-07-24-130340.png 1000w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screenshot-2021-07-24-130340.png 1234w" sizes="(min-width: 720px) 720px" width="1234" height="567" loading="lazy"></figure><p>これでヘッダーは完全に中央に配置されました。</p><p>見た目が少し良くなるように、ヘッダーをより目立たせて、かっこいいフォントを設定する必要があります。そのために、まずは以下のようにして見出しタグをヘッダーの周りに追加します:</p><pre><code>import './App.css';

function App() {
  return (
    &lt;div className="main"&gt;
      &lt;h2&gt;React Crud Operations&lt;/h2&gt;
    &lt;/div&gt;
  );
}

export default App;
</code></pre><p>次に Google Fonts からフォントをインポートしましょう。 <a href="https://fonts.google.com/">https://fonts.google.com/</a> にアクセスし、1 つ選択します。</p><p>お好みのフォントを選択してください。ただし、この記事の中では Montserrat フォントファミリーを使用します。</p><p>フォントを選択したら、次のようにして App.css ファイル内でフォントをインポートしてください:</p><pre><code>@import url('https://fonts.googleapis.com/css2?family=Montserrat&amp;display=swap');
</code></pre><p>では、ヘッダーのフォントを変更しましょう。</p><pre><code>    &lt;div className="main"&gt;
      &lt;h2 className="main-header"&gt;React Crud Operations&lt;/h2&gt;
    &lt;/div&gt;
</code></pre><p>このように、見出しタグの <code>className</code> 属性の値を、<code>main-header</code> に設定してください。</p><p>それから、App.css 内で、Montserrat フォントファミリーを追加してください:</p><pre><code>.main-header{
  font-family: 'Montserrat', sans-serif;
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screenshot-2021-07-24-132749-1.jpg" class="kg-image" alt="Screenshot-2021-07-24-132749-1" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/Screenshot-2021-07-24-132749-1.jpg 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screenshot-2021-07-24-132749-1.jpg 822w" sizes="(min-width: 720px) 720px" width="822" height="368" loading="lazy"></figure><p>これでヘッダーが変更されたのが確認できます。</p><h2 id="crud--1">CRUD コンポーネントを作成する方法</h2><p>これから、4 つの CRUD 操作 (Create - 生成、Read - 読み取り、Update - 更新、Delete - 削除) に対応するコンポーネントを作成してみましょう。</p><p>src フォルダーの中に、components というフォルダーを作成してください。それから、このフォルダーの中に create、read、update という 3 つのファイルを作成してください。delete については、コンポーネントを追加する必要はありません。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screenshot-2021-07-24-133242.png" class="kg-image" alt="Screenshot-2021-07-24-133242" width="334" height="107" loading="lazy"></figure><p>では、Create (生成) 操作を実装しましょう。</p><p>ただそのためには、Mock API を使用する必要があります。この API は作成したデータを偽のサーバーへ送信するもので、単に学習目的で使用します。</p><p>それでは、<a href="https://mockapi.io/">https://mockapi.io/</a> へアクセスし、アカウントを作成してください。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/mockAPI.jpg" class="kg-image" alt="mockAPI" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/mockAPI.jpg 600w, https://www.freecodecamp.org/japanese/news/content/images/size/w1000/2022/01/mockAPI.jpg 1000w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/mockAPI.jpg 1545w" sizes="(min-width: 720px) 720px" width="1545" height="865" loading="lazy"><figcaption>MockAPI</figcaption></figure><p>プラスボタンをクリックしてプロジェクトを作成してください。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/createProject.jpg" class="kg-image" alt="createProject" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/createProject.jpg 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/createProject.jpg 999w" sizes="(min-width: 720px) 720px" width="999" height="329" loading="lazy"><figcaption>プラスボタンをクリックして新しいプロジェクトを作成</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/projectName.png" class="kg-image" alt="projectName" width="508" height="576" loading="lazy"></figure><p>プロジェクトの名前を入力して、CREATE ボタンをクリックしてください。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/newResorce.png" class="kg-image" alt="newResorce" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/newResorce.png 600w, https://www.freecodecamp.org/japanese/news/content/images/size/w1000/2022/01/newResorce.png 1000w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/newResorce.png 1039w" sizes="(min-width: 720px) 720px" width="1039" height="370" loading="lazy"></figure><p>NEW RESOURCE ボタンをクリックして新しいリソースを作成してください。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/resorceName.png" class="kg-image" alt="resorceName" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/resorceName.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/resorceName.png 741w" sizes="(min-width: 720px) 720px" width="741" height="892" loading="lazy"></figure><p>Resorce Name の欄へ名前を入力することを求められますので、使用する名前を入力してください。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/resorceNameFakeData-1.png" class="kg-image" alt="resorceNameFakeData-1" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/resorceNameFakeData-1.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/resorceNameFakeData-1.png 734w" sizes="(min-width: 720px) 720px" width="734" height="902" loading="lazy"></figure><p>name、avatar、createdAt などの余分な欄は必要ありませんので削除してください。その後で、CREATE をクリックしてください。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/createFakeAPI.png" class="kg-image" alt="createFakeAPI" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/createFakeAPI.png 600w, https://www.freecodecamp.org/japanese/news/content/images/size/w1000/2022/01/createFakeAPI.png 1000w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/createFakeAPI.png 1023w" sizes="(min-width: 720px) 720px" width="1023" height="333" loading="lazy"></figure><p>これで、fakeData という名前の、偽の API を作成できました。</p><p>fakeData の上でクリックすると、新しいタブで API が開くのを確認できます。現在データベースは空です。</p><h2 id="create-">Create コンポーネント用のフォームを作成する方法</h2><p>次に、Semantic UI ライブラリーが提供しているフォームを使用してみましょう。</p><p>Semantic UI React へアクセスし、左側の検索バーの中で Form を検索してください。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/SemanticReactForm.png" class="kg-image" alt="SemanticReactForm" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/SemanticReactForm.png 600w, https://www.freecodecamp.org/japanese/news/content/images/size/w1000/2022/01/SemanticReactForm.png 1000w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/SemanticReactForm.png 1219w" sizes="(min-width: 720px) 720px" width="1219" height="472" loading="lazy"></figure><p>このようなフォームが表示されるので、上部左側の Try it をクリックして、コードを取得してください。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/FormCode.png" class="kg-image" alt="FormCode" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/FormCode.png 600w, https://www.freecodecamp.org/japanese/news/content/images/size/w1000/2022/01/FormCode.png 1000w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/FormCode.png 1194w" sizes="(min-width: 720px) 720px" width="1194" height="732" loading="lazy"></figure><p>コードをコピーしたら、次のように create.js ファイルの中に貼り付けてください:</p><pre><code>import React from 'react'
import { Button, Checkbox, Form } from 'semantic-ui-react'

const Create = () =&gt; (
    &lt;Form&gt;
        &lt;Form.Field&gt;
            &lt;label&gt;First Name&lt;/label&gt;
            &lt;input placeholder='First Name' /&gt;
        &lt;/Form.Field&gt;
        &lt;Form.Field&gt;
            &lt;label&gt;Last Name&lt;/label&gt;
            &lt;input placeholder='Last Name' /&gt;
        &lt;/Form.Field&gt;
        &lt;Form.Field&gt;
            &lt;Checkbox label='I agree to the Terms and Conditions' /&gt;
        &lt;/Form.Field&gt;
        &lt;Button type='submit'&gt;Submit&lt;/Button&gt;
    &lt;/Form&gt;
)

export default Create;
</code></pre><p>では、Create コンポーネントを App.js ファイルの中でインポートしてください。</p><pre><code>import './App.css';
import Create from './components/create';

function App() {
  return (
    &lt;div className="main"&gt;
      &lt;h2 className="main-header"&gt;React Crud Operations&lt;/h2&gt;
      &lt;div&gt;
        &lt;Create/&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  );
}

export default App;
</code></pre><p>そうすると次のようになります:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/formInit.png" class="kg-image" alt="formInit" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/formInit.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/formInit.png 882w" sizes="(min-width: 720px) 720px" width="882" height="579" loading="lazy"></figure><p>しかし、ここで問題が発生します – 項目が適切にそろえられていませんし、テキスト入力欄のラベルの色が黒になってしまっています。では、これを修正してみましょう。</p><p>create.js ファイルの中で、<strong>Form</strong> の className の値を <code>create-form</code> に設定してください。</p><figure class="kg-card kg-code-card"><pre><code>import React from 'react'
import { Button, Checkbox, Form } from 'semantic-ui-react'

const Create = () =&gt; (
    &lt;Form className="create-form"&gt;
        &lt;Form.Field&gt;
            &lt;label&gt;First Name&lt;/label&gt;
            &lt;input placeholder='First Name' /&gt;
        &lt;/Form.Field&gt;
        &lt;Form.Field&gt;
            &lt;label&gt;Last Name&lt;/label&gt;
            &lt;input placeholder='Last Name' /&gt;
        &lt;/Form.Field&gt;
        &lt;Form.Field&gt;
            &lt;Checkbox label='I agree to the Terms and Conditions' /&gt;
        &lt;/Form.Field&gt;
        &lt;Button type='submit'&gt;Submit&lt;/Button&gt;
    &lt;/Form&gt;
)

export default Create;
</code></pre><figcaption>create.js</figcaption></figure><p>そして、 App.css ファイルの中に以下のクラスセレクターを追加してください:</p><figure class="kg-card kg-code-card"><pre><code>.create-form label{
  color: whitesmoke !important;
  font-family: 'Montserrat', sans-serif;
  font-size: 12px !important;
}
</code></pre><figcaption>App.css</figcaption></figure><p>このクラスセレクターはフォームの各欄のラベルを指定して、文字色を whitesmoke に設定しています。また、フォントを変更して、フォントサイズを大きくしています。</p><p>では、main という <code>className</code> のセレクターの中で、flex-direction プロパティーを追加してください。このプロパティーの値を column 方向に設定することで、<code>className</code> が main である要素の中の各要素が、垂直にそろえられます。</p><figure class="kg-card kg-code-card"><pre><code>.main{
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background-color: #212121;
  color: whitesmoke;
  flex-direction: column;
}
</code></pre><figcaption>App.css</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/columnDirectionForm.png" class="kg-image" alt="columnDirectionForm" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/columnDirectionForm.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/columnDirectionForm.png 757w" sizes="(min-width: 720px) 720px" width="757" height="623" loading="lazy"></figure><p>これで、フォームの外観が改善されるのが確認できます。</p><p>では次に、フォーム欄からデータを取得してコンソールの中で表示してみましょう。そのために、React の <code>useState</code> フックを使用します。</p><p>create.js ファイルの中で、React から <code>useState</code> をインポートしてください。</p><pre><code>import React, { useState } from 'react';
</code></pre><p>その後で、First Name、Last Name、チェックボックス用のステート (state) を作成してください。各ステートは、空のストリングまたは false で初期化します。</p><pre><code>import React, { useState } from 'react';
import { Button, Checkbox, Form } from 'semantic-ui-react'

export default function Create() {
    const [firstName, setFirstName] = useState('');
    const [lastName, setLastName] = useState('');
    const [checkbox, setCheckbox] = useState(false);
    return (
        &lt;div&gt;
            &lt;Form className="create-form"&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;First Name&lt;/label&gt;
                    &lt;input placeholder='First Name' /&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;Last Name&lt;/label&gt;
                    &lt;input placeholder='Last Name' /&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;Checkbox label='I agree to the Terms and Conditions' /&gt;
                &lt;/Form.Field&gt;
                &lt;Button type='submit'&gt;Submit&lt;/Button&gt;
            &lt;/Form&gt;
        &lt;/div&gt;
    )
}
</code></pre><p>現在、Create コンポーネントは関数コンポーネントとして機能しているのが確認できます。フックは、関数コンポーネントの中だけで使用できるので、コンポーネントを関数コンポーネントに変更する必要があります。</p><p>では、First Name、Last Name、チェックボックスの各欄の値を、<code>setFirstName</code>、<code>setLastName</code>、<code>setCheckbox</code> プロパティーを用いて、それぞれ設定しましょう。</p><pre><code>&lt;input placeholder='First Name' onChange={(e) =&gt; setFirstName(e.target.value)}/&gt;

&lt;input placeholder='Last Name' onChange={(e) =&gt; setLastName(e.target.value)}/&gt;

&lt;Checkbox label='I agree to the Terms and Conditions' onChange={(e) =&gt; setCheckbox(!checkbox)}/&gt;
</code></pre><p>それから、firstName、lastName、checkbox の各ステートの値を取得してみましょう。</p><p>ここで、後から API へデータを送信するのに使用する、<code>postData</code> という名の関数を作成します。その関数の中に、次のコードを記述してください:</p><pre><code>const postData = () =&gt; {
        console.log(firstName);
        console.log(lastName);
        console.log(checkbox);
}
</code></pre><p>では、First Name、Last Name、チェックボックスの値をコンソールに出力してみましょう。</p><p>Submit ボタンに、onClick イベントを使用してこの関数を割り当てることによって、Submit ボタンを押したときに、この関数が呼び出されるようにします。</p><pre><code>&lt;Button onClick={postData} type='submit'&gt;Submit&lt;/Button&gt;
</code></pre><p>これまでの内容をすべて含んだ、<em>create</em> ファイル用のコードはこちらです:</p><pre><code>import React, { useState } from 'react';
import { Button, Checkbox, Form } from 'semantic-ui-react'

export default function Create() {
    const [firstName, setFirstName] = useState('');
    const [lastName, setLastName] = useState('');
    const [checkbox, setCheckbox] = useState(false);
    const postData = () =&gt; {
        console.log(firstName);
        console.log(lastName);
        console.log(checkbox);
    }
    return (
        &lt;div&gt;
            &lt;Form className="create-form"&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;First Name&lt;/label&gt;
                    &lt;input placeholder='First Name' onChange={(e) =&gt; setFirstName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;Last Name&lt;/label&gt;
                    &lt;input placeholder='Last Name' onChange={(e) =&gt; setLastName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;Checkbox label='I agree to the Terms and Conditions' onChange={(e) =&gt; setCheckbox(!checkbox)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Button onClick={postData} type='submit'&gt;Submit&lt;/Button&gt;
            &lt;/Form&gt;
        &lt;/div&gt;
    )
}
</code></pre><p>First name と Last name の中に値を入力して、チェックボックスにチェックを入れてください。その後で、Submit ボタンをクリックしてみてください。すると次のように、コンソールの中にデータがポップアップするのが確認できます:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/dataPopUp.png" class="kg-image" alt="dataPopUp" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/dataPopUp.png 600w, https://www.freecodecamp.org/japanese/news/content/images/size/w1000/2022/01/dataPopUp.png 1000w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/dataPopUp.png 1270w" sizes="(min-width: 720px) 720px" width="1270" height="880" loading="lazy"></figure><h2 id="axios-api-mock-api-">Axios を使って API リクエストを Mock API へ送信する方法</h2><p>今度は、Axios を使ってフォームのデータを偽のサーバーへ送信してみましょう。</p><p>しかしまずは、Axios をインストールする必要があります。</p><p><code>npm i axios</code> と入力して、パッケージをインストールしてください。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/AxiosInstall.png" class="kg-image" alt="AxiosInstall" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/AxiosInstall.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/AxiosInstall.png 896w" sizes="(min-width: 720px) 720px" width="896" height="416" loading="lazy"></figure><p>パッケージのインストールが終了したら、Create 操作の実装を開始しましょう。</p><p>Axios をファイルの先頭でインポートしてください。</p><figure class="kg-card kg-code-card"><pre><code>import axios from 'axios';
</code></pre><figcaption>Axios のインポート</figcaption></figure><p><code>postData</code> 関数の中で、Axios を使用して POST リクエストを送信します。</p><figure class="kg-card kg-code-card"><pre><code>const postData = () =&gt; {
        axios.post(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData`, {
            firstName,
            lastName,
            checkbox
        })
}
</code></pre><figcaption>POST リクエストの送信</figcaption></figure><p>ご覧のとおり、ここでは axios.post を使用しています。また axios.post の中に、先ほど作成した API のエンドポイントがあります。その後に、中括弧で囲まれたフォームの項目があります。</p><p>Submit をクリックした時に、この関数が呼び出され API サーバーにデータを送信します。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/postFormData.png" class="kg-image" alt="postFormData" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/postFormData.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/postFormData.png 615w" width="615" height="432" loading="lazy"></figure><p>では、First Name と Last Name を入力して、チェックボックスにチェックを入れたら、Submit をクリックしてください。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/postedFormData.png" class="kg-image" alt="postedFormData" width="512" height="32" loading="lazy"></figure><p>その後で API を確認してみると、オブジェクトの中に囲まれた状態で、入力した First Name と Last Nameの値と、true という値に設定された checkbox を取得できます。</p><h2 id="read-update-delete-">Read 、Update、Delete の各操作を実装する方法</h2><p>Read (読み取り) 操作の実装を開始するために、Read ページを作成する必要があります。また、React Router パッケージを用いて、ユーザーをさまざまなページへ案内する必要があります。</p><p><a href="https://reactrouter.com/web/guides/quick-start">https://reactrouter.com/web/guides/quick-start</a> へアクセスし、また、<code>npm i react-router-dom@5</code> を使用してパッケージをインストールしてください。</p><p>パッケージのインストールが済んだら、React Router からコンポーネントをいくつかインポートします:</p><figure class="kg-card kg-code-card"><pre><code>import { BrowserRouter as Router, Route } from 'react-router-dom'
</code></pre><figcaption>React Router から Router と Route をインポート</figcaption></figure><p>App.js の中で、return の中のコードをすべて Router でラップしてください。基本的に Router の内部にあるものは、 React の中でルーティングを使用できることを意味しています。</p><pre><code>import './App.css';
import Create from './components/create';
import { BrowserRouter as Router, Route } from 'react-router-dom'

function App() {
  return (
    &lt;Router&gt;
      &lt;div className="main"&gt;
        &lt;h2 className="main-header"&gt;React Crud Operations&lt;/h2&gt;
        &lt;div&gt;
          &lt;Create /&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/Router&gt;
  );
}

export default App;
</code></pre><p>現在、App.js は上のような状態でしょう。</p><p>では、return 内の Create を置き換えて、以下のコードを追加してください:</p><pre><code>import './App.css';
import Create from './components/create';
import { BrowserRouter as Router, Route } from 'react-router-dom'

function App() {
  return (
    &lt;Router&gt;
      &lt;div className="main"&gt;
        &lt;h2 className="main-header"&gt;React Crud Operations&lt;/h2&gt;
        &lt;div&gt;
          &lt;Route exact path='/create' component={Create} /&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/Router&gt;
  );
}

export default App;
</code></pre><p>ここでは、Create をルートコンポーネントとして使用しています。Create のパスは '/create' に設定しました。そのため、<a href="http://localhost:3000/create">http://localhost:3000/create</a> へアクセスすれば、Create ページを見ることができます。</p><p>同じように、read と update に対応するルートが必要です。</p><pre><code>import './App.css';
import Create from './components/create';
import Read from './components/read';
import Update from './components/update';
import { BrowserRouter as Router, Route } from 'react-router-dom'

function App() {
  return (
    &lt;Router&gt;
      &lt;div className="main"&gt;
        &lt;h2 className="main-header"&gt;React Crud Operations&lt;/h2&gt;
        &lt;div&gt;
          &lt;Route exact path='/create' component={Create} /&gt;
        &lt;/div&gt;
        &lt;div style={{ marginTop: 20 }}&gt;
          &lt;Route exact path='/read' component={Read} /&gt;
        &lt;/div&gt;

        &lt;Route path='/update' component={Update} /&gt;
      &lt;/div&gt;
    &lt;/Router&gt;
  );
}

export default App;
</code></pre><p>上のコードで確認できるように、read と update のルートを作成します。</p><p>ここで <a href="http://localhost:3000/read">http://localhost:3000/read</a> へアクセスすると、Read ページが次のように表示されます:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/planeReadComponent.png" class="kg-image" alt="planeReadComponent" width="513" height="242" loading="lazy"><figcaption>Read ルート</figcaption></figure><p>また、<a href="http://localhost:3000/update">http://localhost:3000/update</a> では、次のように Update コンポーネントが表示されます:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/planeUpdateComponent.png" class="kg-image" alt="planeUpdateComponent" width="505" height="281" loading="lazy"></figure><h3 id="read-">Read 操作</h3><p>Read 操作には、テーブルコンポーネントが必要です。そのため、React Semantic UI にアクセスし、ライブラリーが提供しているテーブルを、以下のように使用してください。</p><figure class="kg-card kg-code-card"><pre><code>import React from 'react';
import { Table } from 'semantic-ui-react'
export default function Read() {
    return (
        &lt;div&gt;
            &lt;Table singleLine&gt;
                &lt;Table.Header&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.HeaderCell&gt;Name&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Registration Date&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;E-mail address&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Premium Plan&lt;/Table.HeaderCell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Header&gt;

                &lt;Table.Body&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.Cell&gt;John Lilki&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;September 14, 2013&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;jhlilk22@yahoo.com&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;No&lt;/Table.Cell&gt;
                    &lt;/Table.Row&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.Cell&gt;Jamie Harington&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;January 11, 2014&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;jamieharingonton@yahoo.com&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;Yes&lt;/Table.Cell&gt;
                    &lt;/Table.Row&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.Cell&gt;Jill Lewis&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;May 11, 2014&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;jilsewris22@yahoo.com&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;Yes&lt;/Table.Cell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Body&gt;
            &lt;/Table&gt;
        &lt;/div&gt;
    )
}
</code></pre><figcaption>read.js</figcaption></figure><p>ここではテーブルの中にいくつかのダミーデータが用いられていますが、1 列分のデータだけが必要なので、残りは削除しましょう。</p><figure class="kg-card kg-code-card"><pre><code>import React from 'react';
import { Table } from 'semantic-ui-react'
export default function Read() {
    return (
        &lt;div&gt;
            &lt;Table singleLine&gt;
                &lt;Table.Header&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.HeaderCell&gt;Name&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Registration Date&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;E-mail address&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Premium Plan&lt;/Table.HeaderCell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Header&gt;

                &lt;Table.Body&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.Cell&gt;John Lilki&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;September 14, 2013&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;jhlilk22@yahoo.com&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;No&lt;/Table.Cell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Body&gt;
            &lt;/Table&gt;
        &lt;/div&gt;
    )
}
</code></pre><figcaption>read.js</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/reducedRows.png" class="kg-image" alt="reducedRows" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/02/reducedRows.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/02/reducedRows.png 721w" sizes="(min-width: 720px) 720px" width="721" height="342" loading="lazy"></figure><p>これが Read ページの出力画面です。テーブルには列が 4 つありますが、必要なのは 3 つだけです。</p><p>余分な項目の列を削除してから、次のように項目の名前をつけなおしてください:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/reducedColumn.png" class="kg-image" alt="reducedColumn" width="568" height="321" loading="lazy"></figure><p>すると現在、Read ページはこのように見えます:</p><figure class="kg-card kg-code-card"><pre><code>import React from 'react';
import { Table } from 'semantic-ui-react'
export default function Read() {
    return (
        &lt;div&gt;
            &lt;Table singleLine&gt;
                &lt;Table.Header&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.HeaderCell&gt;First Name&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Last Name&lt;/Table.HeaderCell&gt;
                        &lt;Table.HeaderCell&gt;Checked&lt;/Table.HeaderCell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Header&gt;

                &lt;Table.Body&gt;
                    &lt;Table.Row&gt;
                        &lt;Table.Cell&gt;Nishant&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;Kumar&lt;/Table.Cell&gt;
                        &lt;Table.Cell&gt;Yes&lt;/Table.Cell&gt;
                    &lt;/Table.Row&gt;
                &lt;/Table.Body&gt;
            &lt;/Table&gt;
        &lt;/div&gt;
    )
}
</code></pre><figcaption>read.js</figcaption></figure><p>では、API から GET リクエストを送信してデータを取得してみましょう。</p><p>アプリケーションがマウントされる時に、取得したデータが必要になるので、<code>useEffect</code> フックを使用して実装してください。</p><figure class="kg-card kg-code-card"><pre><code>import React, { useEffect } from 'react';

 useEffect(() =&gt; {
       
 }, [])
</code></pre><figcaption>useEffect フック</figcaption></figure><p>ステートを 1 つ作成して、取得したデータを格納します。取得するデータは配列です。</p><figure class="kg-card kg-code-card"><pre><code>import React, { useEffect, useState } from 'react';

const [APIData, setAPIData] = useState([]);
useEffect(() =&gt; {
       
}, [])
</code></pre><figcaption>取得した API データを格納する APIData ステート</figcaption></figure><p>では、<code>useEffect</code> フックの中で、GET リクエストを送信してみましょう。</p><pre><code> useEffect(() =&gt; {
        axios.get(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData`)
            .then((response) =&gt; {
                setAPIData(response.data);
            })
    }, [])
</code></pre><p>ここでは axios.get を使用して、GET リクエストを API へ送信しています。その後で、リクエストが resolve (成功) すれば、レスポンスデータを <em>APIData</em> ステート内に格納します。</p><p>続いて、取得した API データに応じてテーブルの行をマッピングしましょう。</p><p>そのために Map 関数を使用します。Map 関数は配列を反復処理して、データを出力画面内に表示します。</p><pre><code>&lt;Table.Body&gt;
  {APIData.map((data) =&gt; {
     return (
       &lt;Table.Row&gt;
          &lt;Table.Cell&gt;{data.firstName}&lt;/Table.Cell&gt;
           &lt;Table.Cell&gt;{data.lastName}&lt;/Table.Cell&gt;
           &lt;Table.Cell&gt;{data.checkbox ? 'Checked' : 'Unchecked'}&lt;/Table.Cell&gt;
        &lt;/Table.Row&gt;
   )})}
&lt;/Table.Body&gt;
</code></pre><p>API 内のデータに応じて、firstName, lastName, checkbox のそれぞれのデータをマッピングしています。また、ここでは三項演算子 ('?') を使用しています。data.checkbox が true である場合は、Checked と表示され、そうでない場合は Unchecked と表示されます。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/ReadOutput.png" class="kg-image" alt="ReadOutput" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/02/ReadOutput.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/02/ReadOutput.png 674w" width="674" height="401" loading="lazy"><figcaption>read.js の出力画面</figcaption></figure><h3 id="update-">Update 操作</h3><p>それでは、テーブルに Update (更新) 用のヘッダーをもう 1 つ作成し、Update ボタン用の列を、Table.Row の中に作成してください。Update ボタンには、Semantic UI React が提供している Button コンポーネントをインポートして使用してください。</p><figure class="kg-card kg-code-card"><pre><code>&lt;Table.HeaderCell&gt;Update&lt;/Table.HeaderCell&gt;

&lt;Table.Cell&gt; 
  &lt;Button&gt;Update&lt;/Button&gt;
&lt;/Table.Cell&gt;
</code></pre><figcaption>Update ボタンの作成</figcaption></figure><p>ここで、Update ボタンがクリックされた時に、 Update ページにリダイレクトされる必要があります。そのためには React Router が提供している Link が必要です。</p><p>では、React Router から Link をインポートしてください。それから、Link タグの中へ Update ボタン用の Table.Cell をラップしてください。</p><figure class="kg-card kg-code-card"><pre><code>import { Link } from 'react-router-dom';

&lt;Link to='/update'&gt;
  &lt;Table.Cell&gt; 
     &lt;Button&gt;Update&lt;/Button&gt;
   &lt;/Table.Cell&gt;
&lt;/Link&gt;
</code></pre><figcaption>Update ボタン用の Link</figcaption></figure><p>これで、Update ボタンをクリックした時に、Update ページへリダイレクトされるようになりました。</p><p>また、Update ボタンをクリックした時に、各列のデータを更新するには、API が提供している、それぞれの ID が必要です。</p><p><code>setData</code> という名前の関数をコンポーネントの先頭に作成してください。それから、その関数を Update ボタンにバインドしてください。</p><pre><code> &lt;Button onClick={() =&gt; setData()}&gt;Update&lt;/Button&gt;
</code></pre><p>ここでは、先頭の関数へ引数としてデータを渡す必要があります。</p><pre><code> &lt;Button onClick={() =&gt; setData(data)}&gt;Update&lt;/Button&gt;
</code></pre><p>そして、先頭の関数の中で、データをコンソール内に表示させます:</p><pre><code>const setData = (data) =&gt; {
   console.log(data);
}
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/updateDataInConsole.png" class="kg-image" alt="updateDataInConsole" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/02/updateDataInConsole.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/02/updateDataInConsole.png 686w" width="686" height="116" loading="lazy"><figcaption>コンソール内のデータ</figcaption></figure><p>では、update ボタンをクリックして、コンソールを確認してみてください。テーブルの各項目のデータを取得しています。</p><p>今度は、このデータをローカルストレージへ格納しましょう。</p><figure class="kg-card kg-code-card"><pre><code>const setData = (data) =&gt; {
        let { id, firstName, lastName, checkbox } = data;
        localStorage.setItem('ID', id);
        localStorage.setItem('First Name', firstName);
        localStorage.setItem('Last Name', lastName);
        localStorage.setItem('Checkbox Value', checkbox);
}
</code></pre><figcaption>ローカルストレージ内へデータを格納</figcaption></figure><p>このようにして、データを id、firstName、lastName、checkbox に分割してから、ローカルストレージへ格納しています。ローカルストレージを使用することで、ブラウザー内でローカルにデータを保存できます。</p><p>今ここで、Update コンポーネント内に update 操作用のフォームが 1 つ必要です。Create コンポーネントで用いたフォームを再利用しましょう。関数名を単に Create から Update へ変更するだけです。</p><figure class="kg-card kg-code-card"><pre><code>import React, { useState } from 'react';
import { Button, Checkbox, Form } from 'semantic-ui-react'
import axios from 'axios';

export default function Update() {
    const [firstName, setFirstName] = useState('');
    const [lastName, setLastName] = useState('');
    const [checkbox, setCheckbox] = useState(false);

    return (
        &lt;div&gt;
            &lt;Form className="create-form"&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;First Name&lt;/label&gt;
                    &lt;input placeholder='First Name' onChange={(e) =&gt; setFirstName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;Last Name&lt;/label&gt;
                    &lt;input placeholder='Last Name' onChange={(e) =&gt; setLastName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;Checkbox label='I agree to the Terms and Conditions' onChange={(e) =&gt; setCheckbox(!checkbox)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Button type='submit'&gt;Update&lt;/Button&gt;
            &lt;/Form&gt;
        &lt;/div&gt;
    )
}
</code></pre><figcaption>Update ページ</figcaption></figure><p><code>useEffect</code> フックを Update コンポーネント内で作成してください。このフックを使い、前もってローカルストレージへ格納したデータを取り出します。さらに、ID 項目用のステートをもう一つ作成します。</p><pre><code>const [id, setID] = useState(null);

useEffect(() =&gt; {
        setID(localStorage.getItem('ID'))
        setFirstName(localStorage.getItem('First Name'));
        setLastName(localStorage.getItem('Last Name'));
        setCheckbox(localStorage.getItem('Checkbox Value'))
}, []);
</code></pre><p>それから、ローカルストレージから取り出したデータを、キーに応じて配置します。フォームの各欄の中に、取り出した値を配置する必要があります。Update ページがロードされた時に、各欄の中にデータが自動的に配置されるようにしましょう。</p><figure class="kg-card kg-code-card"><pre><code>&lt;Form className="create-form"&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;First Name&lt;/label&gt;
                    &lt;input placeholder='First Name' value={firstName} onChange={(e) =&gt; setFirstName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;Last Name&lt;/label&gt;
                    &lt;input placeholder='Last Name' value={lastName} onChange={(e) =&gt; setLastName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;Checkbox label='I agree to the Terms and Conditions' checked={checkbox} onChange={(e) =&gt; setCheckbox(!checkbox)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Button type='submit'&gt;Update&lt;/Button&gt;
            &lt;/Form&gt;
</code></pre><figcaption>フォームの各欄の中に値を配置</figcaption></figure><p>これで、Read ページ内の Update ボタンをクリックすると、Update ページへリダイレクトされ、そこで自動的に配置されたフォームデータを見ることができます。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/populatedDataInUpdatePage.png" class="kg-image" alt="populatedDataInUpdatePage" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/02/populatedDataInUpdatePage.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/02/populatedDataInUpdatePage.png 619w" width="619" height="415" loading="lazy"><figcaption>Update ページ</figcaption></figure><p>それでは、Update リクエストを実装してデータを更新してみましょう。</p><p><code>updateAPIData</code> という名前の関数を作成してください。この関数の中で、axios.put を用いて PUT リクエストを送信し、データを更新します。</p><pre><code>const updateAPIData = () =&gt; {
    axios.put(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData/${id}`, {
        firstName,
         lastName,
         checkbox
	})
}
</code></pre><p>ここでは API エンドポイントに id 項目を添えているのが確認できます。</p><p>Read ページで、項目の Update ボタンをクリックした時に、その ID がローカルストレージの中に格納され、その後に Update ページ で取り出した ID を <em><code>id</code></em> ステートの中に格納しています。</p><p>そうした後に、<code>id</code> をエンドポイントへ渡しています。こうすることで、渡している ID の項目を更新できます。</p><p>次に、<code>updateAPIData</code> 関数を Update ボタンにバインドしてください。</p><figure class="kg-card kg-code-card"><pre><code>&lt;Button type='submit' onClick={updateAPIData}&gt;Update&lt;/Button&gt;
</code></pre><figcaption>updateAPIData を Update ボタンにバインド</figcaption></figure><p>Read ページにあるテーブルの中の、Update ボタンをクリックしてから、Last name を変更し、Update ページにある Update ボタンをクリックしてください。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/updatingTheFields.png" class="kg-image" alt="updatingTheFields" width="523" height="433" loading="lazy"><figcaption>Last Name 項目の更新</figcaption></figure><p>API を確認してみるか、または Read ページへ戻ってみると、last name が変更されているのを確認できます。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/updatedMockAPIData.png" class="kg-image" alt="updatedMockAPIData" width="513" height="28" loading="lazy"><figcaption>変更された Mock API のデータ</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/updatedReadTable.png" class="kg-image" alt="updatedReadTable" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/02/updatedReadTable.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/02/updatedReadTable.png 684w" width="684" height="347" loading="lazy"><figcaption>Read ページのテーブル</figcaption></figure><h3 id="delete-">Delete 操作</h3><p>まずは、Read ページのテーブルに、Delete &nbsp;(削除) 操作用のボタンを 1 つ追加しましょう。</p><figure class="kg-card kg-code-card"><pre><code>&lt;Table.HeaderCell&gt;Delete&lt;/Table.HeaderCell&gt;

&lt;Table.Cell&gt;
   &lt;Button&gt;Delete&lt;/Button&gt;
&lt;/Table.Cell&gt;
</code></pre><figcaption>Read ページのテーブル内に Delete ボタンを追加</figcaption></figure><p>次に、<code>onDelete</code> という名前の関数を作成してから、Delete ボタンにその関数をバインドしてください。この関数は、Delete ボタンをクリックした時に ID パラメータを受け取ります。</p><figure class="kg-card kg-code-card"><pre><code>const onDelete = (id) =&gt; {

}

&lt;Table.Cell&gt;
   &lt;Button onClick={() =&gt; onDelete(data.id)}&gt;Delete&lt;/Button&gt;
&lt;/Table.Cell&gt;
</code></pre><figcaption>Delete 操作用の関数</figcaption></figure><p>では、axios.delete を使用して、それぞれの項目を削除する操作を実装しましょう。</p><figure class="kg-card kg-code-card"><pre><code>const onDelete = (id) =&gt; {
  axios.delete(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData/${id}`)
}
</code></pre><figcaption>API から項目を削除</figcaption></figure><p>Delete ボタンをクリックしてから API を確認してみてください。クリックした項目のデータが削除されているのを確認できます。</p><p>ここで、クリックした項目のデータが削除された後に、テーブルのデータをロードし直す必要があります。</p><p>そのために、API のデータを読み込む関数を作成してください。</p><figure class="kg-card kg-code-card"><pre><code>const getData = () =&gt; {
    axios.get(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData`)
        .then((getData) =&gt; {
             setAPIData(getData.data);
         })
}
</code></pre><figcaption>API のデータを取得</figcaption></figure><p>そして <code>onDelete</code> 関数の中で、項目を削除した後に更新された API のデータを読み込む必要があります。</p><figure class="kg-card kg-code-card"><pre><code>const onDelete = (id) =&gt; {
        axios.delete(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData/${id}`)
     .then(() =&gt; {
        getData();
    })
}
</code></pre><figcaption>項目を削除した後に更新された API のデータを読み込む</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/ReadTableBeforeDataDeleted.png" class="kg-image" alt="ReadTableBeforeDataDeleted" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/02/ReadTableBeforeDataDeleted.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/02/ReadTableBeforeDataDeleted.png 711w" width="711" height="446" loading="lazy"><figcaption>Read ページのテーブル</figcaption></figure><p>これで、今は各項目の Delete ボタンをクリックすることでその項目が削除され、テーブルが自動的に最新の情報に更新されます。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/02/ReadTableAfterDataDeleted.png" class="kg-image" alt="ReadTableAfterDataDeleted" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/02/ReadTableAfterDataDeleted.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/02/ReadTableAfterDataDeleted.png 673w" width="673" height="335" loading="lazy"><figcaption>項目が 1 つ削除された後の Read ページのテーブル</figcaption></figure><h2 id="crud--2">CRUD アプリを少し改善してみましょう</h2><p>これまで、Create ページの中でデータを投稿 (post) する時には、単にデータを偽のデータベースの中へ入れていましたが、その際に Read ページへリダイレクトする必要があります。</p><p>それではまず、React Router から <code>useHistory</code> をインポートしてください。</p><figure class="kg-card kg-code-card"><pre><code>import { useHistory } from 'react-router';
</code></pre><figcaption>React Router から useHistory をインポート</figcaption></figure><p>次に、<code>let</code> 文で history という名前の変数を作成して、その変数の中に <code>useHistory</code> を格納してください。</p><pre><code>let history = useHistory();
</code></pre><p>その後で、post API が呼び出されてから、POST リクエストが resolve した時に、history.push 関数を使用して Read ページへ移動します。</p><figure class="kg-card kg-code-card"><pre><code>const postData = () =&gt; {
        axios.post(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData`, {
            firstName,
            lastName,
            checkbox
        }).then(() =&gt; {
            history.push('/read')
        })
    }
</code></pre><figcaption>Post API が resolve した後で Read ページへ移動する</figcaption></figure><p>このように <code>useHistory</code> フックを用いることで Read ページへ移動できます。</p><p>Update ページについても同じことを行ってください。</p><figure class="kg-card kg-code-card"><pre><code>import React, { useState, useEffect } from 'react';
import { Button, Checkbox, Form } from 'semantic-ui-react'
import axios from 'axios';
import { useHistory } from 'react-router';

export default function Update() {
    let history = useHistory();
    const [id, setID] = useState(null);
    const [firstName, setFirstName] = useState('');
    const [lastName, setLastName] = useState('');
    const [checkbox, setCheckbox] = useState(false);

    useEffect(() =&gt; {
        setID(localStorage.getItem('ID'))
        setFirstName(localStorage.getItem('First Name'));
        setLastName(localStorage.getItem('Last Name'));
        setCheckbox(localStorage.getItem('Checkbox Value'));
    }, []);

    const updateAPIData = () =&gt; {
        axios.put(`https://60fbca4591156a0017b4c8a7.mockapi.io/fakeData/${id}`, {
            firstName,
            lastName,
            checkbox
        }).then(() =&gt; {
            history.push('/read')
        })
    }
    return (
        &lt;div&gt;
            &lt;Form className="create-form"&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;First Name&lt;/label&gt;
                    &lt;input placeholder='First Name' value={firstName} onChange={(e) =&gt; setFirstName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;label&gt;Last Name&lt;/label&gt;
                    &lt;input placeholder='Last Name' value={lastName} onChange={(e) =&gt; setLastName(e.target.value)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Form.Field&gt;
                    &lt;Checkbox label='I agree to the Terms and Conditions' checked={checkbox} onChange={() =&gt; setCheckbox(!checkbox)}/&gt;
                &lt;/Form.Field&gt;
                &lt;Button type='submit' onClick={updateAPIData}&gt;Update&lt;/Button&gt;
            &lt;/Form&gt;
        &lt;/div&gt;
    )
}
</code></pre><figcaption>Update.js</figcaption></figure><p>以上で、React と React フックを使用して CRUD 操作を実行する方法について理解できました！</p><p>学習内容を補足したい場合は、<a href="https://youtu.be/-ZMP8ZladIQ">React CRUD Operations</a> という YouTube のビデオ を、この記事の代わりに見ることができます。</p><p>さらに、コードをテストしてみたい場合は、<a href="https://github.com/nishant-666/React-CRUD-Operation-V2">GitHubでコードを見つける</a>ことができます。</p><blockquote><strong>ハッピーラーニング</strong></blockquote> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ React で Axios を使用する方法とは: 決定版ガイド (2021年) ]]>
                </title>
                <description>
                    <![CDATA[ このガイドでは、React フックを盛り込んだ多くの実例を使用することによって、React で Axios.js を正しく使用する方法がわかります。 まず、なぜデータの取り込みライブラリとして Axios を使用すべきなのかについてお伝えし、React で Axios を設定する方法と、主要な 4 つのタイプの HTTP リクエストを Axios で送信する方法について見ていきます。 その後、再利用性を良くするために Axios インスタンスを作成し、わかりやすくするために async-await を使用する方法や、カスタムフックとして Axios を使用する方法など、より高度な機能について触れます。 さっそくはじめましょう！ プログラムの写しが必要ですか?‬ 📄 PDF 形式のチートシートをダウンロードするにはこちらをクリックしてください [https://reedbarger.com/resources/react-axios-2021] (5 秒で終わります)。 このチートシートは、この記事の重要な情報をすべて含んでいる、便利な PDF ガイドです。 目次  * A ]]>
                </description>
                <link>https://www.freecodecamp.org/japanese/news/how-to-use-axios-with-react/</link>
                <guid isPermaLink="false">61dbd7a3c6ab600507251760</guid>
                
                    <category>
                        <![CDATA[ AXIOS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Manabu Matsumoto ]]>
                </dc:creator>
                <pubDate>Wed, 23 Feb 2022 23:45:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/japanese/news/content/images/2022/01/how-to-use-axios-with-react.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文:</strong> <a href="https://www.freecodecamp.org/news/how-to-use-axios-with-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How To Use Axios With React: The Definitive Guide (2021)</a>
      </p><p>このガイドでは、React フックを盛り込んだ多くの実例を使用することによって、React で Axios.js を正しく使用する方法がわかります。</p><p>まず、なぜデータの取り込みライブラリとして Axios を使用すべきなのかについてお伝えし、React で Axios を設定する方法と、主要な 4 つのタイプの HTTP リクエストを Axios で送信する方法について見ていきます。</p><p>その後、再利用性を良くするために Axios インスタンスを作成し、わかりやすくするために async-await を使用する方法や、カスタムフックとして Axios を使用する方法など、より高度な機能について触れます。</p><p>さっそくはじめましょう！</p><h3 id="-"><strong>プログラムの写しが必要ですか?‬ 📄</strong></h3><p><a href="https://reedbarger.com/resources/react-axios-2021"><strong><strong>PDF 形式のチートシートをダウンロードするにはこちらをクリックしてください</strong></strong></a> (5 秒で終わります)。</p><p>このチートシートは、この記事の重要な情報をすべて含んでいる、便利な PDF ガイドです。</p><h2 id="--1">目次</h2><ul><li><a href="#axios-">Axios とは?</a></li><li><a href="#-react-axios-">なぜ React の中で Axios を用いるのか？</a></li><li><a href="#react-axios-">React で Axios を設定する方法</a></li><li><a href="#get-">GET リクエストを送信する方法 (データの取得)</a></li><li><a href="#post-">POST リクエストを送信する方法 (データの作成)</a></li><li><a href="#put-">PUT リクエストを送信する方法 (データの更新)</a></li><li><a href="#delete-">DELETE リクエストを送信する方法 (データの削除)</a></li><li><a href="#axios--1">Axios でエラーを扱う方法</a></li><li><a href="#axios--2">Axios インスタンスを作成する方法</a></li><li><a href="#axios-async-await-">Axios で Async-Await 構文を使用する方法</a></li><li><a href="#-useaxios-">カスタム <code>useAxios</code> フックを作成する方法</a></li></ul><h2 id="axios-">Axios とは？</h2><p>Axios とは、特定のエンドポイントへのリクエストを送信できるようにする、HTTP クライアントライブラリです:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screen-Shot-2021-07-12-at-1.14.41-PM-2.png" class="kg-image" alt="Screen-Shot-2021-07-12-at-1.14.41-PM-2" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/Screen-Shot-2021-07-12-at-1.14.41-PM-2.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screen-Shot-2021-07-12-at-1.14.41-PM-2.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="731" loading="lazy"></figure><p>たとえば、外部 API や独自のバックエンド Node.js サーバーを、Axios で実装できます。</p><p>リクエストを送信することで、API に、そのリクエストに応じた処理の実行を要求します。</p><p>たとえば、GET リクエストを送信した場合は、アプリケーションの中で表示するデータを返信するように要求します。</p><h2 id="-react-axios-">なぜ React の中で Axios を用いるのか？</h2><p>HTTP リクエストの送信に使用できる、さまざまなライブラリが数多く存在しているにもかかわらず、なぜ Axios を選択するのでしょうか？</p><p>HTTP リクエストを送信するクライアントとして、 Axios を使用すべき <strong>5 つの理由</strong>を、以下に挙げます:</p><ol><li>Axios は、初期設定で JSON 形式のデータをうまく扱うことができます。Fetch API などの別のものと違い、多くの場合はヘッダーを設定する必要がありません。また、リクエストボディを JSON 文字列へ変換するといった、面倒な作業を行う必要がありません。</li><li>Axios には、主な HTTP メソッドと一致する名前の関数が用意されています。GET リクエストを送信する時は、<code>.get()</code> メソッドを使用します。</li><li>Axios は、より少ないコードでより多くのことを行います。Fetch API と違い、一度だけ <code>.then()</code> コールバックを用いれば、リクエストした JSON データにアクセスできます。</li><li>Axios にはより良いエラー処理機能があります。ステータスコードをチェックして、エラーを自分で返さなければならない Fetch API と違い、Axios は 400 番台と 500 番台のエラーレスポンスステータスコードを返します。</li><li>Axios は、クライアント側でもサーバー側でも使用できます。Node.js でアプリケーションのコードを記述している場合は、ブラウザーとは別の環境の中でも Axios を使用できることに注意してください。</li></ol><h2 id="react-axios-">React で Axios を設定する方法</h2><p>React で Axios を使用する手順はとても簡単です。以下の 3 つのことが必要です:</p><ol><li>React のプロジェクトを作成してあること</li><li>npm または yarn で Axios をインストールすること</li><li>リクエストを送信するための API エンドポイント</li></ol><p>新しい React アプリケーションを最も早く作成する方法は、<a href="https://react.new">react.new</a> を訪れることです。</p><p>すでに React のプロジェクトがある場合は、Axios を npm (または他のパッケージマネージャー) でインストールする必要があるだけです:</p><pre><code class="language-bash">npm install axios
</code></pre><p>また、このガイドでは JSON Placeholder API を使って、投稿 (post) データを取得し、変更します。</p><p>リクエストを送信できる全てのルートについて、それぞれにふさわしい HTTP メソッドと一緒に記載したものの一覧がこちらです:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screen-Shot-2021-07-10-at-12.21.28-PM-2.png" class="kg-image" alt="Screen-Shot-2021-07-10-at-12.21.28-PM-2" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/Screen-Shot-2021-07-10-at-12.21.28-PM-2.png 600w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/Screen-Shot-2021-07-10-at-12.21.28-PM-2.png 617w" width="617" height="386" loading="lazy"></figure><p>Axios と API のエンドポイントを使用して行う操作 (投稿の取得、作成、更新、削除) の手短な例がこちらです:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/axios-react-2.gif" class="kg-image" alt="axios-react-2" width="1920" height="1080" loading="lazy"></figure><h2 id="get-">GET リクエストを送信する方法</h2><p>データを取得したり検索するには、GET リクエストを送信します。</p><p>最初に、個々の投稿に対してリクエストを送信してみましょう。エンドポイントを見てみると、 <code>/posts/1</code> エンドポイントから最初の投稿を取得できます:</p><pre><code class="language-js">import axios from "axios";
import React from "react";

const baseURL = "https://jsonplaceholder.typicode.com/posts/1";

export default function App() {
  const [post, setPost] = React.useState(null);

  React.useEffect(() =&gt; {
    axios.get(baseURL).then((response) =&gt; {
      setPost(response.data);
    });
  }, []);

  if (!post) return null;

  return (
    &lt;div&gt;
      &lt;h1&gt;{post.title}&lt;/h1&gt;
      &lt;p&gt;{post.body}&lt;/p&gt;
    &lt;/div&gt;
  );
}
</code></pre><p><code>useEffect</code> フックを使って、コンポーネントがマウントされた時点でこのリクエストを送信します。これには Axios をインポートし、<code>.get()</code> メソッドを用いて GET リクエストをエンドポイントへ送信し、<code>.then()</code> コールバックを用いてすべてのレスポンスデータを取得することが伴います。</p><p>レスポンスはオブジェクトとして返されます。データ (この場合、 <code>id</code>、<code>title</code>、<code>body</code> プロパティーを伴う投稿データ) は <code>post</code> と呼ばれるステートに格納され、コンポーネントの中で表示されます。</p><p>レスポンスの中の <code>.data</code> プロパティーから、常にリクエストされたデータを見つけることができるということに注意してください。</p><h2 id="post-">POST リクエストを送信する方法</h2><p>新しいデータを作成するには、POST リクエストを送信します。</p><p>JSON Placeholder API の仕様に従い、POST リクエストを <code>/posts</code> エンドポイントに送信する必要があります。以下のコードを見てみると、投稿データを作成するボタンがあるのを確認できます:</p><pre><code class="language-js">import axios from "axios";
import React from "react";

const baseURL = "https://jsonplaceholder.typicode.com/posts";

export default function App() {
  const [post, setPost] = React.useState(null);

  React.useEffect(() =&gt; {
    axios.get(`${baseURL}/1`).then((response) =&gt; {
      setPost(response.data);
    });
  }, []);

  function createPost() {
    axios
      .post(baseURL, {
        title: "Hello World!",
        body: "This is a new post."
      })
      .then((response) =&gt; {
        setPost(response.data);
      });
  }

  if (!post) return "No post!"

  return (
    &lt;div&gt;
      &lt;h1&gt;{post.title}&lt;/h1&gt;
      &lt;p&gt;{post.body}&lt;/p&gt;
      &lt;button onClick={createPost}&gt;Create Post&lt;/button&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>ボタンをクリックすると、<code>createPost</code> 関数を呼び出します。</p><p>Axios で POST リクエストを送信するには、<code>.post()</code> メソッドを使用します。作成しようとしている新しい投稿データを、オブジェクトのプロパティーとして記述し、第二引数として渡します。</p><p>もう一度 <code>.then()</code> コールバックを使ってレスポンスデータを取得し、最初に取得した投稿を、リクエストした新しい投稿 に置き換えます。</p><p>‌‌これは <code>.get()</code> メソッドとよく似ていますが、作成しようとしている新しいリソースが、API エンドポイントの後ろに第二引数として渡されています。</p><h2 id="put-">PUT リクエストを送信する方法</h2><p>特定のリソースを更新するには、PUT リクエストを送信します。</p><p>以下の例では、最初の投稿を更新します。</p><p>そのためにもう一度ボタンを作成しましょう。ただし今回は、投稿を更新するための関数を、ボタンで呼び出します:</p><pre><code class="language-js">import axios from "axios";
import React from "react";

const baseURL = "https://jsonplaceholder.typicode.com/posts";

export default function App() {
  const [post, setPost] = React.useState(null);

  React.useEffect(() =&gt; {
    axios.get(`${baseURL}/1`).then((response) =&gt; {
      setPost(response.data);
    });
  }, []);

  function updatePost() {
    axios
      .put(`${baseURL}/1`, {
        title: "Hello World!",
        body: "This is an updated post."
      })
      .then((response) =&gt; {
        setPost(response.data);
      });
  }

  if (!post) return "No post!"

  return (
    &lt;div&gt;
      &lt;h1&gt;{post.title}&lt;/h1&gt;
      &lt;p&gt;{post.body}&lt;/p&gt;
      &lt;button onClick={updatePost}&gt;Update Post&lt;/button&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>上のコードの中では、Axois の PUT メソッドを使用します。POST メソッドの場合と同じように、更新しようとしているリソースをオブジェクトのプロパティーとして記述し、第二引数として渡しています。</p><p>ここでまた <code>.then()</code> コールバックを用いて、返ってきたデータで JSX を更新します。</p><h2 id="delete-">DELETE リクエストを送信する方法</h2><p>最後に、リソースを削除するために、DELETE メソッドを使用します。</p><p>その例として、最初の投稿を削除してみましょう。</p><p>このリクエストを送信する時に、第二引数には何も必要ないことに注意してください:</p><pre><code class="language-js">import axios from "axios";
import React from "react";

const baseURL = "https://jsonplaceholder.typicode.com/posts";

export default function App() {
  const [post, setPost] = React.useState(null);

  React.useEffect(() =&gt; {
    axios.get(`${baseURL}/1`).then((response) =&gt; {
      setPost(response.data);
    });
  }, []);

  function deletePost() {
    axios
      .delete(`${baseURL}/1`)
      .then(() =&gt; {
        alert("Post deleted!");
        setPost(null)
      });
  }

  if (!post) return "No post!"

  return (
    &lt;div&gt;
      &lt;h1&gt;{post.title}&lt;/h1&gt;
      &lt;p&gt;{post.body}&lt;/p&gt;
      &lt;button onClick={deletePost}&gt;Delete Post&lt;/button&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>ほとんどの場合、<code>.delete()</code> メソッドから返ってきたデータは必要ありません。</p><p>ただし上のコードの中では、リクエストが正常に resolve (成功) したことを確かめるために、<code>.then()</code> コールバックがさらに用いられています。</p><p>上のコードの中で、投稿が削除された後に、ユーザーはうまく削除されたことを通知されます。それから、ステートの <code>post</code> の値が、初期値である <code>null</code> に設定されます。</p><p>また、一度投稿が削除されると、「No post」というテキストがアラートメッセージの後にすぐに表示されます。</p><h2 id="axios--1">Axios でエラーを扱う方法</h2><p>Axios でエラーを扱うとはどういうことについて言うのでしょうか？</p><p>リクエストの送信中にエラーが発生するとどうなるでしょうか？例えば、誤ったデータを送信したり、誤ったエンドポイントへリクエストを送信したり、ネットワークエラーが発生したりする場合があるかもしれません。</p><p>エラーのシミュレーションを行うために、<code>/posts/asdf</code> というような存在しない API エンドポイントにリクエストを送信してみましょう。</p><p>このリクエストを送信すると、<code>404</code> ステータスコードが返ってきます:</p><pre><code class="language-js">import axios from "axios";
import React from "react";

const baseURL = "https://jsonplaceholder.typicode.com/posts";

export default function App() {
  const [post, setPost] = React.useState(null);
  const [error, setError] = React.useState(null);

  React.useEffect(() =&gt; {
    // invalid url will trigger an 404 error
    axios.get(`${baseURL}/asdf`).then((response) =&gt; {
      setPost(response.data);
    }).catch(error =&gt; {
      setError(error);
    });
  }, []);
  
  if (error) return `Error: ${error.message}`;
  if (!post) return "No post!"

  return (
    &lt;div&gt;
      &lt;h1&gt;{post.title}&lt;/h1&gt;
      &lt;p&gt;{post.body}&lt;/p&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>この場合、<code>.then()</code> コールバックを実行する代わりに、Axios はエラーを返して、<code>.catch()</code> コールバック関数を実行します。</p><p>この関数の中で、エラーデータを取得してステートに保存することで、エラーについてユーザーに通知します。つまり、エラーが発生したらエラーメッセージを表示します。</p><p>このコードを実行したときに、「Error: Request failed with status code 404」というテキストが見えます。</p><h2 id="axios--2">Axios インスタンスを作成する方法</h2><p>これまでの例を見てみると、各リクエストを送信するために用いる Axios のエンドポイントの一部として、 <code>baseURL</code> があるのを確認できます。</p><p>とはいえ、すべてのリクエストに対してひとつずつ <code>baseURL</code> を記述し続けるのはちょっと面倒ですよね。いつも似たようなエンドポイントを含んでいるのですから、使用している <code>baseURL</code> を、単に Axios に覚えさせることはできないものでしょうか？</p><p>実はできます。<code>.create()</code> メソッドでインスタンスを作成した場合、Axios は <code>baseURL</code> を記憶し、さらに、すべてのリクエストに対して指定し得る、ヘッダーを含めた他の値を記憶します:</p><pre><code class="language-js">import axios from "axios";
import React from "react";

const client = axios.create({
  baseURL: "https://jsonplaceholder.typicode.com/posts" 
});

export default function App() {
  const [post, setPost] = React.useState(null);

  React.useEffect(() =&gt; {
    client.get("/1").then((response) =&gt; {
      setPost(response.data);
    });
  }, []);

  function deletePost() {
    client
      .delete("/1")
      .then(() =&gt; {
        alert("Post deleted!");
        setPost(null)
      });
  }

  if (!post) return "No post!"

  return (
    &lt;div&gt;
      &lt;h1&gt;{post.title}&lt;/h1&gt;
      &lt;p&gt;{post.body}&lt;/p&gt;
      &lt;button onClick={deletePost}&gt;Delete Post&lt;/button&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>上のコードでは、設定用オブジェクトのプロパティーは <code>baseURL</code> だけであり、それにエンドポイントを渡しています。</p><p>この場合では、<code>.create()</code> 関数は <code>client</code> と呼ばれる、新しく作られたインスタンスを返します。</p><p>そうすることで、今後は、これまでと同じすべてのメソッドを用いるときに、第一引数として <code>baseURL</code> を渡す必要が無くなります。例えば、<code>/</code>、<code>/1</code> などの必要な特定のルートを、単に参照するだけで済みます。</p><h2 id="axios-async-await-">Axios で Async-Await 構文を使用する方法</h2><p>JavaScript (React アプリケーションを含む) の中でプロミスを用いることの大きな利点は、async-await 構文が使用できることです。</p><p>async-await は、より簡潔なコードを記述できるようにしてくれます。さらに、async-await を用いたコードは、同期コードにとてもよく似ていますし、わかりやすいです。</p><p>では、どのようにして Axios で async-await 構文を用いればよいのでしょうか？</p><p>以下の例において、投稿が取得されてから、さらにその投稿を削除するボタンがあります:</p><pre><code class="language-js">import axios from "axios";
import React from "react";

const client = axios.create({
  baseURL: "https://jsonplaceholder.typicode.com/posts" 
});

export default function App() {
  const [post, setPost] = React.useState(null);

  React.useEffect(() =&gt; {
    async function getPost() {
      const response = await client.get("/1");
      setPost(response.data);
    }
    getPost();
  }, []);

  async function deletePost() {
    await client.delete("/1");
    alert("Post deleted!");
    setPost(null);
  }

  if (!post) return "No post!"

  return (
    &lt;div&gt;
      &lt;h1&gt;{post.title}&lt;/h1&gt;
      &lt;p&gt;{post.body}&lt;/p&gt;
      &lt;button onClick={deletePost}&gt;Delete Post&lt;/button&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>ここでは <code>useEffect</code> の中に、<code>getPost</code> と呼ばれる <code>async</code> 関数があります。</p><p>関数を <code>async</code> にしたことにより、<code>await</code> キーワードを用いて GET リクエストを resolve させ、次の行でそのデータをステートに設定することが可能になりました。これで <code>.then()</code> コールバックを使わずに書くことができます。</p><p><code>getPost</code> 関数が、作成された後ですぐに呼び出されていることに注意してください。</p><p>さらに、<code>deletePost</code> 関数も <code>async</code> になっています。これは、promise を resolve する <code>await</code> キーワードを使用するために必要です (Axios メソッドはすべて、resolve すべき promise を返します) 。</p><p>‌‌DELETE リクエストと一緒に <code>await</code> キーワードを使用した後で、ユーザーは投稿が削除されたことを通知され、ステートの <code>post</code> の値を <code>null</code> に設定します。</p><p>ご覧になったとおり、async-await はコードを大幅に整理し、とても簡単に、Axios と一緒に使用できます。</p><h2 id="-useaxios-">カスタム <code>useAxios</code> フックを作成する方法</h2><p>async-await は、コードをわかりやすくする素晴らしい方法ですが、これをさらにもう一歩進めることができます。</p><p>コンポーネントがマウントされる際に <code>useEffect</code> を用いてデータを取得する代わりに、Axios で同じ処理を実行できる独自のカスタムフックを、再利用できる関数として作成できます。</p><p>カスタムフックは自分で作れますが、その一方で、use-axois-client と呼ばれるとても良いライブラリが、カスタム <code>useAxios</code> フックを提供しています。</p><p>まずは、パッケージをインストールします:</p><pre><code>npm install use-axios-client
</code></pre><p>フックを使用するために、JavaScript ファイルの先頭で、use-axios-client から <code>useAxios</code> をインポートします。</p><p>もう <code>useEffect</code> は必要ないため、React のインポートは削除できます:</p><pre><code class="language-js">import { useAxios } from "use-axios-client";

export default function App() {
  const { data, error, loading } = useAxios({
    url: "https://jsonplaceholder.typicode.com/posts/1"
  });

  if (loading || !data) return "Loading...";
  if (error) return "Error!";

  return (
    &lt;div&gt;
      &lt;h1&gt;{data.title}&lt;/h1&gt;
      &lt;p&gt;{data.body}&lt;/p&gt;
    &lt;/div&gt;
  ) 
}
</code></pre><p>これで、<code>useAxios</code> を App コンポーネントの先頭で呼び出してから、リクエストを送信しようとしている URL を渡すことができます。また、このフックは、いろいろな状態を扱うのに必要となる、すべての値 (<code>loading</code>、<code>error</code>、そして resolve した <code>data</code>) を含むオブジェクトを返します。</p><p>このリクエストの実行中は、 <code>loading</code> の値は true です。エラーが発生した場合は、エラー状態を表示しましょう。そうでなければ、返ってきたデータがある場合は UI (ユーザーインターフェース) の中でそれを表示できます。</p><p>このようなカスタムフックの利点は、コードを実際に削減し、全体的に簡素化できることです。</p><p>Axios でより単純にデータを取得する方法を探しているなら、試しに今回のようにカスタム <code>useAxios</code> フックを使ってみてください。</p><h2 id="--2">その次は？</h2><p>おめでとうございます！ 最も強力な HTTP クライアントライブラリのひとつを使用して、React アプリケーションを強化する方法を今、知ることができました。</p><p>このガイドから、多くのことを学んでいただけるよう願っています。</p><p><a href="https://reedbarger.com/resources/react-axios-2021">後で参照できるように、このガイドを PDF チートシートとしてダウンロードできることを覚えておいてください。</a></p><h2 id="-react-bootcamp-">さらに多くの学びをご希望でしょうか？ React Bootcamp にご参加ください</h2><p><a href="https://reactbootcamp.com/"><strong>React Bootcamp</strong></a> は、Reactの学習について知っておくべきことをすべて取り入れ、ビデオ、チートシート、特別なボーナスなどを、1つのわかりやすいパッケージにまとめています。</p><p>React のプロになり、夢の仕事を得て、自分の未来を管理するために、<strong>何百人もの開発者</strong>がすでに使用している内部関係者向けの情報をこちらで手に入れてください:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/japanese/news/content/images/2022/01/react-bootcamp-1.png" class="kg-image" alt="react-bootcamp-1" srcset="https://www.freecodecamp.org/japanese/news/content/images/size/w600/2022/01/react-bootcamp-1.png 600w, https://www.freecodecamp.org/japanese/news/content/images/size/w1000/2022/01/react-bootcamp-1.png 1000w, https://www.freecodecamp.org/japanese/news/content/images/2022/01/react-bootcamp-1.png 1590w" sizes="(min-width: 1200px) 1200px" width="1590" height="567" loading="lazy"></figure><p><em><a href="http://bit.ly/join-react-bootcamp">通知を受け取るにはこちらをクリックしてください</a></em></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
