useState)、読み込み時にデータを取得するようアプリに指示する(useEffect)ためにReactフックを使用します。フックは基本的にコードで使用できる再利用可能なロジックです。このガイドではフックの詳しい説明はしません。詳細については、こちらを参照してください。
データの定義
ビデオデータを取得する前に、データがTypeScriptでどのように表示されるかを定義する必要があります。LandingScreen.tsxを開きます。- importステートメントの後に、
IVideoというインターフェイスを作成して次のように定義します。
データの保存
ここで、ビデオデータを保存する場所と、それを使用するコンポーネントをUIで再レンダリングする(イベントに「反応する」)ための更新方法が必要です。useStateフックはこの両方に対応し、変数と、変数を更新する関数を返します。関数を使用して変数が更新されると、その変数を使用するUIコンポーネントが(イベントに「応答」して)再レンダリングされます。
LandingScreen.tsxで、「react」のimportステートメントを更新してuseStateを含めます。useStateは名前付きエクスポートであるため、中かっこで囲む必要があります。エラーを回避するために、ステートメントの構文を変更することも必要です。
- LandingScreenアロー関数の最上部に、次のステートメントを追加します。
LandingScreen.tsxのコードは次のようになります。
データの取得
次に、API呼び出しを実行する関数を作成します。この関数では、APIエンドポイントの呼び出しにFetch APIを使用します(ほかのAPIの呼び出しに使用されるaxios APIは今後サポートされる予定です)。また、setVideo関数を使用して、fetchから返されるビデオの配列を設定します。fetchはPromiseオブジェクトを返すため、.thenを使用して非同期メソッドでコードを処理する必要があります。
LandingScreen.tsxにurlというコンストラクターを作成し、https://d2ob7xfxpe6plv.cloudfront.net/TestData.jsonに設定します。
- LandingScreenの本文内(つまり、LandingScreenアロー関数内)に
getAllVideos()というアロー関数を作成します。 fetchを呼び出してURLを渡します。.thenを追加してレスポンスを待機し、jsonに変換します。
- 別の
.thenステートメントを追加して、videosの値をレスポンスオブジェクトの適切な部分に設定します。
- エラーメッセージに
.catchを追加し、console.logを使用して出力します。
getAllVideos()関数は次のようになります。
テストデータの取得
ビデオのリストを返したり更新したりできる関数ができたので、テストしてみましょう。- 定義後に
getAllVideos()の呼び出しを追加します。 getAllVideos()の呼び出しの前後にvideosを出力するには、console.logステートメントを追加します。
- アプリを再読み込みします。シミュレーターは正しく表示されているのに、Metroターミナルにはログステートメントの無限ループが表示されます。ログ情報は、アプリの実行方法に応じてさまざまな場所にあります。
- VSCodeを使用している場合は、React Nativeの出力パネルを確認してください。

React Nativeの出力パネル
- CLIを使用している場合は、Metroターミナルを確認してください。
videos変数が変更されるたびにLandingScreenが再レンダリングされるためです。再レンダリングごとにビデオが再度取得されるため、無限ループが生じます。
useEffectフックの追加
これを回避するには、getAllVideosへの呼び出しをuseEffectフックに配置する必要があります。このフックを使用すると、レンダリングの合間にvideosが変更された場合にのみ再レンダリングすることができます。
- 「react」のimportステートメントを更新して
useEffectを含めます。このエクスポートは名前付きエクスポートであるため、中かっこ内でuseStateと並べます。
getAllVideos()の呼び出しをuseEffectフックでラップします。このフックはアロー関数を取り込み、getAllVideos()を呼び出します。
[]です。このパラメーターは、1回だけレンダリングするようにuseEffectに指示します。videosを取得する必要があるのは1回だけのため、目的に合っています。useEffectフックの高度な使用方法については、React Nativeのドキュメントを参照してください。
- アプリを再読み込みすると、Metroのターミナルウィンドウに無限ループが発生しなくなります。
- 無限ループを解決したので、console.log()ステートメントを削除します。
ビデオカテゴリの作成
最後に、すべての動画を保存する代わりに、ビデオを特定のカテゴリにフィルタリングして、UIでカテゴリ別にグループ化して表示しましょう。- カテゴリ分けされた動画が代わりに保存されるようにstate変数を変更してください。
- JavaScriptのfilter()メソッドを使用してAPIから動画を受け取った後、getAllVideos関数を変更して動画をカテゴリ別にフィルタリングします。
LandingScreen.tsxは次のようになります。

