【React】スクロール位置に応じて処理をさせたい!これ実装してみて(遅延読み込み)

※ 今回は「スクロール位置に応じて画像を取得するAPIを呼び出す」を例に紹介していきます


1. Intersection Observer API を使う方法

Intersection Observer APIを使うと、要素がビューポートに入ったときにイベントを発生させることができます
これを使って、画像が表示されるエリアに到達したときにAPIを呼び出すことが可能です

Intersection Observerのセットアップ

Intersection Observerを使って監視する要素を設定します

import React, { useEffect, useRef } from 'react';

const ImageComponent = ({ src, alt }) => {
  const imgRef = useRef();

  useEffect(() => {
    const observer = new IntersectionObserver(
      ([entry]) => {
        if (entry.isIntersecting) {
          // APIを呼び出して画像を取得
          fetchImage();
          observer.unobserve(entry.target); // 一度観察対象から外す
        }
      },
      { threshold: 0.1 } // 画像が10%表示されたら発火
    );

    observer.observe(imgRef.current);

    return () => {
      observer.disconnect();
    };
  }, []);

  const fetchImage = () => {
    // ここにAPI呼び出しのロジックを記述
    console.log("Fetching image...");
  };

  return <img ref={imgRef} src={src} alt={alt} />;
};

export default ImageComponent;

画像コンポーネントの使用

上記のコンポーネントを使って、表示する画像リストを作成します

import React from 'react';
import ImageComponent from './ImageComponent';

const App = () => {
  const images = [
    { src: 'image1.jpg', alt: 'Image 1' },
    { src: 'image2.jpg', alt: 'Image 2' },
    // その他の画像
  ];

  return (
    <div>
      {images.map((img, index) => (
        <ImageComponent key={index} src={img.src} alt={img.alt} />
      ))}
    </div>
  );
};

export default App;

2. ライブラリを使用する方法

Reactには、スクロール位置に応じて要素をロードするための便利なライブラリもあります
その一つがreact-intersection-observerです

インストール

npm install react-intersection-observer

使用方法

react-intersection-observerを使って、画像が表示エリアに到達したときにAPIを呼び出します

import React from 'react';
import { useInView } from 'react-intersection-observer';

const ImageComponent = ({ src, alt }) => {
  const { ref, inView } = useInView({
    threshold: 0.1, // 画像が10%表示されたら発火
    triggerOnce: true // 一度だけトリガー
  });

  React.useEffect(() => {
    if (inView) {
      // APIを呼び出して画像を取得
      fetchImage();
    }
  }, [inView]);

  const fetchImage = () => {
    // ここにAPI呼び出しのロジックを記述
    console.log("Fetching image...");
  };

  return <img ref={ref} src={src} alt={alt} />;
};

export default ImageComponent;

ちょっと説明を

useInView フックの使用

  • 「ref」は監視するDOM要素に設定するためのものです
  • 「inView」はその要素がビューポートに表示されているかどうかを示すブール値です

要素の監視

  • 「ref」を画像のDOM要素に設定することで、その要素がビューポートに入るとinViewの値がtrueになります
  • 「threshold: 0.1」は要素が10%表示されたときにトリガーされることを意味します
  • 「triggerOnce: true」は一度トリガーされたら再度トリガーされないようにします

APIの呼び出し

  • useEffectフック内で「inView」の値が変わったときに実行される処理を記述します
  • 「inView」がtrueになったときにfetchImage関数が呼ばれ、API呼び出しが行われます

短時間に多くのAPIを呼び出すのではなく、必要なときにのみ呼び出すことができます
サーバーの負荷を下げることができるのですよね

是非ご参考に下さい!

是非フォローしてください

最新の情報をお伝えします