ホームページ >ウェブフロントエンド >jsチュートリアル >useEffect、Promise、カスタムフックを使用した React での非同期操作の処理
非同期操作の処理は、React アプリケーション、特に API、データベース、または外部サービスを操作する場合の一般的な要件です。 API からのデータの取得や計算の実行などの JavaScript 操作は非同期であることが多いため、React はそれらを適切に処理するためのツールとテクニックを提供します。
このガイドでは、async/await、Promises、およびその他の React 固有のツールを使用して、React で非同期呼び出しを処理するさまざまな方法を検討します。
React の useEffect フックは、コンポーネントのマウント時にデータをフェッチするなどの副作用を実行するのに最適です。フック自体は Promise を直接返すことができないため、エフェクト内で非同期関数を使用します。
useEffect フックを使用してデータをフェッチする非同期呼び出しを処理する方法は次のとおりです。
import React, { useState, useEffect } from 'react'; const API_URL = 'https://jsonplaceholder.typicode.com/posts'; // Example API const AsyncFetchExample = () => { const [posts, setPosts] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Using async/await inside useEffect useEffect(() => { const fetchData = async () => { try { const response = await fetch(API_URL); if (!response.ok) { throw new Error('Failed to fetch data'); } const data = await response.json(); setPosts(data); } catch (error) { setError(error.message); } finally { setLoading(false); } }; fetchData(); // Call the async function }, []); // Empty dependency array means this effect runs once when the component mounts if (loading) return <div>Loading...</div>; if (error) return <div>Error: {error}</div>; return ( <div> <h1>Posts</h1> <ul> {posts.map((post) => ( <li key={post.id}> <h2>{post.title}</h2> <p>{post.body}</p> </li> ))} </ul> </div> ); }; export default AsyncFetchExample;
もう 1 つの一般的なアプローチは、Promises を then() と catch() で直接使用することです。このメソッドは async/await ほど洗練されていませんが、非同期操作を処理するために JavaScript で依然として広く使用されています。
非同期呼び出しに Promise と then() を使用する例を次に示します。
import React, { useState, useEffect } from 'react'; const API_URL = 'https://jsonplaceholder.typicode.com/posts'; const AsyncFetchWithPromise = () => { const [posts, setPosts] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetch(API_URL) .then((response) => { if (!response.ok) { throw new Error('Failed to fetch data'); } return response.json(); }) .then((data) => { setPosts(data); setLoading(false); }) .catch((error) => { setError(error.message); setLoading(false); }); }, []); if (loading) return <div>Loading...</div>; if (error) return <div>Error: {error}</div>; return ( <div> <h1>Posts</h1> <ul> {posts.map((post) => ( <li key={post.id}> <h2>{post.title}</h2> <p>{post.body}</p> </li> ))} </ul> </div> ); }; export default AsyncFetchWithPromise;
より複雑な状態遷移がある場合、または非同期プロセス中に複数のアクション (読み込み、成功、エラーなど) を処理する必要がある場合、useReducer は状態の変更を管理する優れたツールです。
import React, { useState, useEffect } from 'react'; const API_URL = 'https://jsonplaceholder.typicode.com/posts'; // Example API const AsyncFetchExample = () => { const [posts, setPosts] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Using async/await inside useEffect useEffect(() => { const fetchData = async () => { try { const response = await fetch(API_URL); if (!response.ok) { throw new Error('Failed to fetch data'); } const data = await response.json(); setPosts(data); } catch (error) { setError(error.message); } finally { setLoading(false); } }; fetchData(); // Call the async function }, []); // Empty dependency array means this effect runs once when the component mounts if (loading) return <div>Loading...</div>; if (error) return <div>Error: {error}</div>; return ( <div> <h1>Posts</h1> <ul> {posts.map((post) => ( <li key={post.id}> <h2>{post.title}</h2> <p>{post.body}</p> </li> ))} </ul> </div> ); }; export default AsyncFetchExample;
場合によっては、複数のコンポーネント間で非同期ロジックを再利用したい場合があります。 カスタムフックの作成は、ロジックをカプセル化し、コードをより再利用しやすくする優れた方法です。
import React, { useState, useEffect } from 'react'; const API_URL = 'https://jsonplaceholder.typicode.com/posts'; const AsyncFetchWithPromise = () => { const [posts, setPosts] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetch(API_URL) .then((response) => { if (!response.ok) { throw new Error('Failed to fetch data'); } return response.json(); }) .then((data) => { setPosts(data); setLoading(false); }) .catch((error) => { setError(error.message); setLoading(false); }); }, []); if (loading) return <div>Loading...</div>; if (error) return <div>Error: {error}</div>; return ( <div> <h1>Posts</h1> <ul> {posts.map((post) => ( <li key={post.id}> <h2>{post.title}</h2> <p>{post.body}</p> </li> ))} </ul> </div> ); }; export default AsyncFetchWithPromise;
React での非同期操作の処理は、最新の Web アプリケーションを構築するために不可欠です。 useEffect、useReducer、カスタム フックなどのフックを使用すると、非同期動作を簡単に管理し、エラーを処理し、スムーズなユーザー エクスペリエンスを確保できます。データのフェッチ、エラーの処理、複雑な非同期ロジックの実行など、React はこれらのタスクを効率的に管理するための強力なツールを提供します。
以上がuseEffect、Promise、カスタムフックを使用した React での非同期操作の処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。