カテゴリ: React 更新日: 2026/02/18

Reactのカスタムフックで無限スクロールを実装する方法を解説!初心者でもわかるスクロール更新

カスタムフックで無限スクロールを実装する方法
カスタムフックで無限スクロールを実装する方法

先生と生徒の会話形式で理解しよう

生徒

「Reactで画面を下にスクロールしたら自動でデータが追加される仕組みを作りたいんですけどできますか?」

先生

「それは無限スクロールという仕組みですね。カスタムフックを使えばシンプルに実装できますよ。」

生徒

「無限スクロールって聞いたことはあるんですけど、どういう動きをするんですか?」

先生

「例えばSNSやECサイトで下まで見たら自動で次の投稿や商品が読み込まれる仕組みが無限スクロールです。Reactで作り方を見ていきましょう!」

1. 無限スクロールとは?初心者向けに説明

1. 無限スクロールとは?初心者向けに説明
1. 無限スクロールとは?初心者向けに説明

無限スクロールとは、ページの一番下までスクロールすると自動的に新しいデータを読み込む仕組みのことです。例えばInstagramやTwitterで、画面を下に動かすだけで次の投稿が表示されるのが無限スクロールです。

ボタンを押して「次のページ」を読み込むより自然で使いやすいため、多くのWebアプリやReactアプリで利用されています。

2. Reactで無限スクロールを実装するメリット

2. Reactで無限スクロールを実装するメリット
2. Reactで無限スクロールを実装するメリット

Reactで無限スクロールを実装すると以下のメリットがあります。

  • ユーザーが操作しなくても次のデータが自動で表示される
  • ページ遷移が不要で快適にコンテンツを閲覧できる
  • APIとの連携で動的なデータ取得が可能になる

特に商品一覧や記事一覧など、データが多い画面では無限スクロールを使うとユーザー体験が向上します。

3. カスタムフックで無限スクロールを作る仕組み

3. カスタムフックで無限スクロールを作る仕組み
3. カスタムフックで無限スクロールを作る仕組み

無限スクロールの基本は「ユーザーが画面の下に到達したらAPIを呼び出して次のデータを取得する」ことです。これを実現するためにIntersectionObserverという仕組みを使うと便利です。


import { useState, useEffect, useRef } from "react";

function useInfiniteScroll(fetchData) {
  const [items, setItems] = useState([]);
  const [page, setPage] = useState(1);
  const loaderRef = useRef(null);

  useEffect(() => {
    fetchData(page).then(newItems => {
      setItems(prev => [...prev, ...newItems]);
    });
  }, [page]);

  useEffect(() => {
    const observer = new IntersectionObserver(entries => {
      if (entries[0].isIntersecting) {
        setPage(prev => prev + 1);
      }
    });
    if (loaderRef.current) {
      observer.observe(loaderRef.current);
    }
    return () => observer.disconnect();
  }, []);

  return { items, loaderRef };
}

export default useInfiniteScroll;
(このカスタムフックを使うと、スクロールが下に到達したときに自動で新しいデータを読み込めます)

4. 無限スクロールを使ったReactコンポーネント例

4. 無限スクロールを使ったReactコンポーネント例
4. 無限スクロールを使ったReactコンポーネント例

次に作ったフックを実際のコンポーネントで使ってみましょう。ここではサンプルAPIからデータを取得し、画面を下にスクロールすると新しい投稿が追加表示されます。


import React from "react";
import useInfiniteScroll from "./useInfiniteScroll";

function Posts() {
  const fetchData = async (page) => {
    const res = await fetch(
      `https://jsonplaceholder.typicode.com/posts?_page=${page}&_limit=5`
    );
    return await res.json();
  };

  const { items, loaderRef } = useInfiniteScroll(fetchData);

  return (
    <div>
      {items.map(post => (
        <div key={post.id}>
          <h3>{post.title}</h3>
          <p>{post.body}</p>
        </div>
      ))}
      <div ref={loaderRef}>読み込み中...</div>
    </div>
  );
}

export default Posts;
(画面をスクロールすると新しい投稿が自動で追加されて表示されます)

5. 無限スクロールを実装するときの注意点

5. 無限スクロールを実装するときの注意点
5. 無限スクロールを実装するときの注意点

無限スクロールは便利ですが、いくつかの注意点があります。

  • データ量が多すぎるとアプリが重くなるので、表示件数を制限する工夫が必要
  • ユーザーが目的の場所にすぐ移動できないため、場合によっては「ページネーション」との併用が良い
  • APIの呼び出し回数が多くなるため、キャッシュや遅延処理の工夫も重要

特に大規模なReactアプリでは、ユーザー体験とパフォーマンスのバランスを考えて設計することが大切です。

6. 無限スクロールが役立つ場面

6. 無限スクロールが役立つ場面
6. 無限スクロールが役立つ場面

無限スクロールは以下のようなアプリに向いています。

  • SNS(Twitter、Instagramなど)のタイムライン
  • ネットショップの商品一覧ページ
  • ニュース記事の一覧表示

特に「次のページへ進む」という操作を減らしたい場面で非常に有効です。

カテゴリの一覧へ
新着記事
New1
React
React RouterのRouteコンポーネントの使い方を完全解説!初心者でもわかるルーティングの基本
New2
React
Reactのリストとkeyを完全解説!初心者でもわかるユニークなIDをkeyに使うベストプラクティス
New3
React
ReactでFetch APIを使った複数リクエストの並列処理|初心者向けにやさしく解説
New4
Next.js
Next.js Linkコンポーネントの使い方を初心者向けに徹底解説!Next.jsでページ遷移を簡単に実装する方法
人気記事
No.1
Java&Spring記事人気No1
React
Reactとは?初心者でもわかるReact.jsの基本概念と特徴をやさしく解説
No.2
Java&Spring記事人気No2
React
ReactとTypeScriptの環境構築をやさしく解説!Viteとtsconfigの設定も丁寧に紹介
No.3
Java&Spring記事人気No3
React
Reactの学習ロードマップ!初心者が最短で習得する流れを完全ガイド
No.4
Java&Spring記事人気No4
React
React Context APIのデバッグ方法を完全解説!React DevToolsで中身を丸見えにする方法
No.5
Java&Spring記事人気No5
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!
No.6
Java&Spring記事人気No6
React
Reactでファイルアップロードを実装する方法を解説!Fetch APIで画像やPDFを送る仕組みを初心者向けに紹介
No.7
Java&Spring記事人気No7
React
React開発におすすめのVSCode拡張機能まとめ!初心者でもすぐ使える便利ツール紹介
No.8
Java&Spring記事人気No8
Next.js
Next.js自動ルーティングを初心者向けに解説!Next.jsのページ遷移の基本を理解する