カテゴリ: 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でFetch APIをカスタムフックで使いこなす!初心者でもわかるカスタムフック入門
New2
Next.js
Next.jsをTypeScript対応でセットアップする手順を完全解説!初心者でも安心のNext.js環境構築
New3
React
Reactのカスタムフックで無限スクロールを実装する方法を解説!初心者でもわかるスクロール更新
New4
Next.js
Next.jsのlibフォルダ活用完全ガイド!初心者でもわかるロジック整理の基本
人気記事
No.1
Java&Spring記事人気No1
React
ReactでonChangeイベントを使ってフォーム入力値を管理する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
Next.js
Next.jsのApp RouterとPages Routerの役割の違いを完全解説!初心者でもわかるNext.jsの基本概念
No.3
Java&Spring記事人気No3
React
Reactとは?初心者でもわかるReact.jsの基本概念と特徴をやさしく解説
No.4
Java&Spring記事人気No4
React
ReactのuseEffect依存配列を徹底解説!初心者でも理解できるDependency Arrayの仕組み
No.5
Java&Spring記事人気No5
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!
No.6
Java&Spring記事人気No6
Next.js
Next.jsのApp RouterとServer Componentsの関係まとめ!初心者でもわかるNext.jsの新しい仕組み
No.7
Java&Spring記事人気No7
Next.js
Next.jsとは?Reactとの関係を初心者向けにやさしく解説|Next.jsの基本概念と特徴
No.8
Java&Spring記事人気No8
React
React開発におすすめのVSCode拡張機能まとめ!初心者でもすぐ使える便利ツール紹介