「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > React で無限スクロール コンポーネントを構築する

React で無限スクロール コンポーネントを構築する

2024 年 11 月 6 日に公開
ブラウズ:312

導入

アプリケーションや Web ページ、特にスクロールするだけでよいソーシャル メディアで無限スクロールが見られます。何も考えずにスクロールするのは良くありませんが、独自の無限スクロールを構築するのは素晴らしいことです。開発者として、Web サーフィン中に目にするコンポーネントを再作成してみる必要があります。一部のコンポーネントを実装する際には、より多くのことを学び、既成概念にとらわれずに考えることが求められる場合があります。

また、アプリケーションに無限スクロールを実装したい場合は、ガイドに従って独自のスクロールを作成できます。独自のコードを追加して、スクロールの動作を改善できます。

この記事では、無限スクロール コンポーネントを最初から構築します。次のトピックについて説明します:

  • 環境セットアップ
  • コンポーネントのビルド
  • CSS の追加
  • 無限スクロールの最適化

さて、始めましょう。

環境設定

CRA を使用して基本的な React アプリケーションを作成します。次のコマンドを実行することでこれを行うことができます:

    npx create-react-app infinite-scroll

Vite または NextJS を使用したい場合は、それも可能です。マイナーな変更を除けば、その他の点は変わりません。

注: このコマンドを実行するには、NodeJS が事前にインストールされている必要があります。 また、CRA から不要な定型コードの一部を削除します。

API からデータを取得するには、依存関係が 1 つ必要になります。 React を設定した後、次のコマンドで Axios をインストールできます:

    npm install axios

これで、コンポーネントを作成する準備ができました。

アプリコンポーネント

Tmdb API から人気のある映画データを取得するコンポーネントを構築します。 API キーは Web サイトから無料で取得できます。まずデータを取得する場所を構築してから、無限スクロール機能を追加しましょう。

アプリ コンポーネントのコードは次のとおりです:

App.js

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

    function App() {
      const [page, setPage] = useState(1); // for number of page in tmdb 
      const [data, setData] = useState([]); // storing the fetched data
      const [loading, setLoading] = useState(false); // for setting loading state

      // fetching and stroring the data in the state
      const fetchMovie = async () => {
        const URL = `https://api.themoviedb.org/3/movie/popular?language=en-US&page=${page}`;
        const data = await axios.get(URL, {
          headers: {
            Authorization:
              "Bearer API KEY",
            Accept: "application/json",
          },
        });
        setData((prevData) => [...prevData, ...data.data.results]); // we are going to add the new data to current data.
        setLoading(false);
      };

      // useEffecte for invoking the function at the start
      useEffect(() => {
        fetchMovie();
      }, [page]);

      return (
        
Popular movies according to Tmdb
{data.length > 1 && data.map((item) => { return ( ); })} {loading &&

Loading....

}
); } export default App;

データをフェッチし、それをプロップとして MovieCard コンポーネントに渡しているコードをほぼ理解できます。

各映画の情報を表示するための MovieCard.js コンポーネントを作成します。

MoveCard.js

    import React from "react";

    export const MovieCard = ({ title, description, imageURL, rating }) => {

      const imagePath = `https://image.tmdb.org/t/p/w500${imageURL}`; // poster image path URL 

      return (
        
React で無限スクロール コンポーネントを構築する

{title}

{description}

{rating.toFixed(1)}⭐

); };

アプリケーションの CSS は次のとおりです:

App.css

    .App {
      text-align: center;
    }

    .App-header {
      background-color: #282c34;
      min-height: 100vh;
      display: flex;
      flex-direction: column;
      align-items: center;
      padding-top: 1em;
      font-size: calc(10px   2vmin);
      color: white;
    }

    .movieCardContainer{
      margin-top: 1em;
      display: flex;
      flex-direction: column;
      gap: 1em;
      width: 60%;
      max-width: 800px;
    }

    .movieCard{
      display: flex;
    }

    .movieInfo{
      margin-left: 1em;
      text-align: left;
    }

    p{
      font-size: 18px;
    }

無限スクロール

さて、まず無限スクロールをどのように構築するかを理解しましょう。このために、スクロール バーの位置を見ていきます。スクロール バーの位置がページの終わりのすぐ上にある場合、読み込み状態を true に設定します。

ページの状態を 1 ずつ増やす別の useEffect を用意します。ページ番号が更新されると、そのページを依存関係として持つ最初の useEffect がトリガーされます。これにより、 fetchMovie() 関数が呼び出され、データが取得されます。

スクロールへの EventListner の追加

まず、スクロール バーの位置が変更されたことを知るために listen さえ追加します。

    window.addEventListener("scroll", handleScroll);

ハンドルスクロール

スクロールが発生すると、スクロール バーの現在の位置が Web ページの下部 (つまり、垂直スクロール可能な領域の合計) のすぐ上にあるかどうかを確認します。 「はい」の場合、読み込み状態を true に変更します。

    const handleScroll = () => {
      if (document.body.scrollHeight - 300 



  • scrollHeight : 画面に表示されていない部分を含むコンテンツの合計の高さを返すプロパティです。したがって、それはスクロール可能な領域の合計になります。
  • scrollY: 文書を上から垂直方向にスクロールしたピクセル数を返すプロパティです。したがって、スクロールされた領域になります。
  • innerHeight: ブラウザの Windows コンテンツ領域の高さを返すプロパティです。スクロールバーの幅になります。これは、コンテンツを渡したときではなく、コンテンツに到達したときにフェッチが行われるように、scrollY に追加されます。 ## useEffect

読み込み状態の変更に成功したら、ページ番号をインクリメントする useEffect を実装できます。これにより、ムービー データの取得が可能になります。

    useEffect(() => {
      if (loading == true) {
        setPage((prevPage) => prevPage   1);
      }
    }, [loading]);

    // other useEffect that we already implemented

    useEffect(() => {
      fetchMovie();
    }, [page]);

EventListnerの最適化

scroll はスクロール中に handleScroll を複数回トリガーできるため、不要な関数が複数回呼び出されます。関数にデバウンスを追加して、関数を呼び出すまでに時間がかかるようにすることができます。

    // debounce function
    function debounce(func, delay) {
      let timeoutId;
      return function (...args) {
        if (timeoutId) {
          clearTimeout(timeoutId);
        }
        timeoutId = setTimeout(() => {
          func(...args);
        }, delay);
      };
    }

    // adding debounce to the eventListner
    window.addEventListener("scroll", debounce(handleScroll, 500));

App.js の完全なコードは次のとおりです:

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

    function App() {
      const [page, setPage] = useState(1);
      const [data, setData] = useState([]);
      const [loading, setLoading] = useState(false);
      const fetchMovie = async () => {

        const URL = `https://api.themoviedb.org/3/movie/popular?language=en-US&page=${page}`;
        const data = await axios.get(URL, {
          headers: {
            Authorization:
              "Bearer API KEY",
            Accept: "application/json",
          },
        });
        setData((prevData) => [...prevData, ...data.data.results]);
        setLoading(false);
      };
      useEffect(() => {
        fetchMovie();
      }, [page]);

      const handleScroll = () => {
        if (
          document.body.scrollHeight - 300  {
            func(...args);
          }, delay);
        };
      }

      window.addEventListener("scroll", debounce(handleScroll, 500));

      useEffect(() => {
        if (loading == true) {
          setPage((prevPage) => prevPage   1);
        }
      }, [loading]);

      return (
        
Popular movies according to Tmdb
{data.length > 1 && data.map((item) => { return ( ); })} {loading &&

Loading....

}
); } export default App;

これは、アプリケーションの動作を示す GIF です。

Building an Infinite Scroll Component in React

結論

React で無限スクロール コンポーネントを構築することは、非常にやりがいのある経験となる可能性があります。スクロールの仕組みについての理解が深まるだけでなく、状態管理、イベント リスナー、デバウンスなどの最適化テクニックについても学習できます。このガイドに従うことで、基本的な無限スクロールのセットアップが完了し、必要に応じてカスタマイズおよび改善できます。

映画データ、ブログ投稿、その他のコンテンツを表示する場合でも、このコンポーネントは強力な基盤として機能します。重要なのは、ユーザーがスクロールするときにデータがいつどのようにフェッチされるかを注意深く管理することで、スムーズなユーザー エクスペリエンスを確保することであることに注意してください。コーディングを楽しんでください!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/surajondev/building-an-infinite-scroll-component-in-react-1ljb?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • ハクトーバーフェストに貢献する新しい方法: フロントエンド AI で直接
    ハクトーバーフェストに貢献する新しい方法: フロントエンド AI で直接
    Hacktoberfest が帰ってきます。今年は開発者が参加できるエキサイティングな新しい方法をもたらします。 従来の GitHub プル リクエストの代わりに、Webcrumbs プラットフォーム上のフロントエンド AI を通じて直接テンプレートを作成して送信できるようになりました。 tools...
    プログラミング 2024 年 11 月 7 日に公開
  • 関数ポインタが括弧なしで使用されると、「cout」に「1」が出力されるのはなぜですか?
    関数ポインタが括弧なしで使用されると、「cout」に「1」が出力されるのはなぜですか?
    なぜ「関数を呼び出さずに関数を出力します (f() ではなく f;)。常に 1 を出力しますか?」この中でこのコードでは、括弧を使用せずに pr という名前の関数を「呼び出し」ようとします。ただし、これは実際には関数を呼び出しているわけではありません。代わりに、関数ポインタを cout 関数に渡しま...
    プログラミング 2024 年 11 月 7 日に公開
  • Web ページを高速化する
    Web ページを高速化する
    DOM とは何ですか?それは何を食べるのでしょうか? DOM (Document Object Model) は Web ページとその開発の基礎です。これは、HTML および XML ドキュメント用のプログラミング インターフェイスであり、ドキュメントの構造をツリー状のオブジェクト...
    プログラミング 2024 年 11 月 7 日に公開
  • JavaScript での require と import
    JavaScript での require と import
    コーディングを始めたとき、require() を使用してモジュールやインポートを使用して他のファイルをインポートするいくつかの js ファイルを見たことを覚えています。何が違うのか、なぜプロジェクト間で一貫性がないのかがよくわからず、いつも混乱していました。同じことを疑問に思っている場合は、読み続け...
    プログラミング 2024 年 11 月 7 日に公開
  • イメージを使用した Vite/React アプリケーションのデプロイ: 完全ガイド
    イメージを使用した Vite/React アプリケーションのデプロイ: 完全ガイド
    Vite/React アプリケーションを GitHub Pages にデプロイすることはエキサイティングなマイルストーンですが、このプロセスでは、特に画像やアセットを扱う場合、予期せぬ課題が発生することがあります。このブログ投稿では、初期導入から一般的な問題のトラブルシューティング、効果的な解決策の...
    プログラミング 2024 年 11 月 7 日に公開
  • React アプリで API 呼び出しを最適化した方法
    React アプリで API 呼び出しを最適化した方法
    React 開発者として、私たちは、複数の急速な状態変化を API と同期する必要があるシナリオによく直面します。小さな変更ごとに API 呼び出しを行うのは非効率的であり、クライアントとサーバーの両方に負担がかかる可能性があります。ここで、デバウンスと賢明な状態管理が機能します。この記事では、ペイ...
    プログラミング 2024 年 11 月 7 日に公開
  • さあ行こう!
    さあ行こう!
    GO を試す必要がある理由 Go は、高速かつ軽量で静的に型付けされたコンパイル言語で、効率的で信頼性の高いアプリケーションの構築に最適です。そのシンプルさとクリーンな構文により、特に初心者にとって、学習と使用が簡単になります。 Go の優れた機能には、ゴルーチンによる組み込み同時...
    プログラミング 2024 年 11 月 6 日に公開
  • PNG 画像を CSS データ URI の Base64 としてエンコードするにはどうすればよいですか?
    PNG 画像を CSS データ URI の Base64 としてエンコードするにはどうすればよいですか?
    CSS データ URI の PNG 画像に Base64 エンコーディングを使用するデータ URI を使用して PNG 画像を CSS スタイルシートに埋め込むには、PNG データ最初に Base64 形式にエンコードする必要があります。この手法を使用すると、外部画像ファイルをスタイルシート内に直接...
    プログラミング 2024 年 11 月 6 日に公開
  • API 時間別データの応答性の高い JavaScript カルーセル
    API 時間別データの応答性の高い JavaScript カルーセル
    I almost mistook an incomplete solution for a finished one and moved on to work on other parts of my weather app! While working on the carousel that w...
    プログラミング 2024 年 11 月 6 日に公開
  • Web 開発における PHP と JavaScript の主な違いは何ですか?
    Web 開発における PHP と JavaScript の主な違いは何ですか?
    PHP と JavaScript: サーバー側とクライアント側 PHP は JavaScript とは異なる役割を果たします。 PHPはサーバーサイドで動作します。サーバーはアプリケーションを実行します。フォームなどを処理します。フォームを送信すると、PHP がそれを処理します。一...
    プログラミング 2024 年 11 月 6 日に公開
  • C++ で構造体とクラスのメンバーを反復処理して、実行時に名前と値にアクセスするにはどうすればよいですか?
    C++ で構造体とクラスのメンバーを反復処理して、実行時に名前と値にアクセスするにはどうすればよいですか?
    構造体とクラスのメンバーの反復C では、構造体またはクラスのメンバーを反復して名前を取得することができます。そして価値観。これを実現するためのいくつかのアプローチを次に示します。マクロの使用REFLECTABLE マクロを使用して、イントロスペクションを可能にする構造体を定義できます。マクロは、構造...
    プログラミング 2024 年 11 月 6 日に公開
  • 項目 正確な答えが必要な場合は、float と double を避ける
    項目 正確な答えが必要な場合は、float と double を避ける
    float と double の問題: 科学的および数学的計算用に設計されており、2 進浮動小数点演算を実行します。 金銭の計算や正確な答えが必要な状況には適していません。 0.1 などの 10 の負の累乗を正確に表すことができないため、エラーが発生します。 例 1: ドル額を減算する際の計算が正し...
    プログラミング 2024 年 11 月 6 日に公開
  • Go で WebSocket を使用してリアルタイム通信を行う
    Go で WebSocket を使用してリアルタイム通信を行う
    チャット アプリケーション、ライブ通知、共同作業ツールなど、リアルタイムの更新が必要なアプリを構築するには、従来の HTTP よりも高速でインタラクティブな通信方法が必要です。そこで WebSocket が登場します。今日は、アプリケーションにリアルタイム機能を追加できるように、Go で WebSo...
    プログラミング 2024 年 11 月 6 日に公開
  • Python でプロキシを使用して Selenium Webdriver を実行する方法
    Python でプロキシを使用して Selenium Webdriver を実行する方法
    Python でプロキシを使用して Selenium Webdriver を実行するSelenium Webdriver スクリプトを Python スクリプトとしてエクスポートし、コマンド ラインから実行しようとすると、次のような問題が発生する場合があります。使用上の問題 プロキシの場合にエラーが...
    プログラミング 2024 年 11 月 6 日に公開
  • || がいつ行われるか演算子は JavaScript でデフォルトの演算子として機能しますか?
    || がいつ行われるか演算子は JavaScript でデフォルトの演算子として機能しますか?
    || の目的を理解するJavaScript の非ブール オペランドを持つ演算子JavaScript では、|| は演算子は論理 OR 演算子と呼ばれることが多く、通常はブール式を評価するために使用されます。ただし、 || が次のような場合に遭遇する可能性があります。演算子は非ブール値で使用されます...
    プログラミング 2024 年 11 月 6 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3