カテゴリ: React 更新日: 2026/01/08

Reactのカスタムフックでウィンドウサイズを取得する方法!初心者でもわかる実践ステップ

カスタムフックでウィンドウサイズを取得する方法
カスタムフックでウィンドウサイズを取得する方法

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

生徒

「Reactでウィンドウサイズを取得する方法ってありますか?」

先生

「もちろんあります!しかも、カスタムフックを使うととても便利にできますよ。」

生徒

「カスタムフックってなんですか?」

先生

「カスタムフックは、Reactの機能を自分でまとめて再利用できるようにする仕組みです。今回は、それを使ってウィンドウサイズを取得してみましょう!」

1. カスタムフックとは?

1. カスタムフックとは?
1. カスタムフックとは?

まず、カスタムフック(Custom Hook)とは、Reactの中でよく使う「状態管理」や「イベント処理」を関数としてまとめて再利用できる仕組みです。名前の先頭には必ずuseをつける決まりがあります。たとえばuseStateuseEffectのように書きます。

自分でuseWindowSizeというフックを作れば、どのコンポーネントからでも簡単にウィンドウサイズを取得できるようになります。

2. なぜカスタムフックでウィンドウサイズを管理するの?

2. なぜカスタムフックでウィンドウサイズを管理するの?
2. なぜカスタムフックでウィンドウサイズを管理するの?

たとえば、画面の幅に応じてデザインを変える「レスポンシブ対応」をしたいとき、ウィンドウのサイズをリアルタイムで取得する必要があります。

普通にコンポーネント内で書くと、同じ処理を複数のコンポーネントに書くことになり、コードが重複します。そんなときに「カスタムフック」で共通化すると、1つの場所にまとめられて便利です。

3. useWindowSizeフックを作ってみよう

3. useWindowSizeフックを作ってみよう
3. useWindowSizeフックを作ってみよう

それでは実際に、ウィンドウの横幅と高さを取得するカスタムフックを作ってみましょう。


import { useState, useEffect } from "react";

function useWindowSize() {
  const [size, setSize] = useState({
    width: window.innerWidth,
    height: window.innerHeight,
  });

  useEffect(() => {
    const handleResize = () => {
      setSize({
        width: window.innerWidth,
        height: window.innerHeight,
      });
    };

    window.addEventListener("resize", handleResize);
    return () => window.removeEventListener("resize", handleResize);
  }, []);

  return size;
}

export default useWindowSize;

このコードでは、useStateでサイズ情報を保持し、useEffectでウィンドウのサイズ変更イベントを監視しています。handleResizeが呼ばれるたびに新しい幅と高さが更新されます。

4. 作ったフックを使ってみよう

4. 作ったフックを使ってみよう
4. 作ったフックを使ってみよう

次に、このuseWindowSizeフックを実際のReactコンポーネントで使ってみましょう。


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

function App() {
  const { width, height } = useWindowSize();

  return (
    <div>
      <h1>現在のウィンドウサイズ</h1>
      <p>横幅:{width}px</p>
      <p>高さ:{height}px</p>
    </div>
  );
}

export default App;
(画面に現在のウィンドウの横幅と高さが表示され、ブラウザのサイズを変えると数値がリアルタイムで更新されます)

5. useEffectとクリーンアップ処理のポイント

5. useEffectとクリーンアップ処理のポイント
5. useEffectとクリーンアップ処理のポイント

フックの中でwindow.addEventListenerを使ってイベントを登録していますが、コンポーネントが削除(アンマウント)されたときにイベントを解除しないと、メモリリークという問題が起こる可能性があります。

そのため、useEffectの中でreturn () => window.removeEventListener(...)と書いて、後片付け(クリーンアップ)を必ず行うのがポイントです。

6. ウィンドウサイズを利用した応用例

6. ウィンドウサイズを利用した応用例
6. ウィンドウサイズを利用した応用例

このカスタムフックは、レスポンシブデザイン以外にもさまざまな場面で使えます。たとえば、画面が小さいときだけナビゲーションを折りたたんだり、大きい画面ではサイドバーを表示したりできます。

次のように、幅が一定以下の場合にメッセージを切り替えることもできます。


function ResponsiveMessage() {
  const { width } = useWindowSize();

  return (
    
{width < 600 ? ( <p>スマートフォンサイズの画面です!</p> ) : ( <p>PCサイズの画面です!</p> )}
); }
(ブラウザの幅が600px以下になると「スマートフォンサイズの画面です!」に切り替わります)

7. 仕組みをイメージで理解しよう

7. 仕組みをイメージで理解しよう
7. 仕組みをイメージで理解しよう

ウィンドウサイズを取得する処理は、「ブラウザが大きくなった」「小さくなった」という通知を受け取って状態を更新しているイメージです。

つまり、ユーザーがウィンドウを動かすたびに「今の幅と高さを教えて!」とReactに伝えて、画面の表示を自動で変えている仕組みです。

8. カスタムフックでコードをスッキリ保つ

8. カスタムフックでコードをスッキリ保つ
8. カスタムフックでコードをスッキリ保つ

同じウィンドウサイズ取得のロジックを複数の場所で使うとき、毎回useEffectwindow.addEventListenerを書くのは大変です。カスタムフックにまとめることで、たった1行で呼び出せるようになります。

また、プロジェクトが大きくなっても、再利用性が高く保守しやすいコードになります。

9. 実務でも役立つポイント

9. 実務でも役立つポイント
9. 実務でも役立つポイント

Web開発では、ウィンドウサイズによって表示内容を変えることがよくあります。たとえば、ECサイトのカート画面でスマホでは1列、PCでは2列にしたいときなどです。

このようにカスタムフックを使えば、どの画面からでも簡単にサイズ情報を取得できるため、柔軟で効率的な開発が可能になります。

まずはuseWindowSizeを作って、Reactアプリで試してみましょう!シンプルな仕組みですが、実務でも大いに役立つ便利なフックです。

まとめ

まとめ
まとめ

Reactでウィンドウサイズを取得するためのカスタムフックについて振り返ると、ウィンドウサイズという動的に変化する情報をReactの状態管理と組み合わせて扱う方法が非常に重要であると感じられます。特に、レスポンシブデザインが当たり前となった現代のWebアプリケーションでは、画面の幅や高さをもとにレイアウトやコンポーネントの表示内容を切り替える機会が多く、そのたびにウィンドウの状態を正確に把握する必要があります。その役割をスムーズに実現してくれるのが「カスタムフック」であり、useWindowSizeのように状態管理とイベント登録をひとつにまとめておくことで、複数コンポーネントから再利用できる柔軟で効率的な仕組みとなります。 また、ウィンドウサイズ取得の処理はイベントリスナーを使うため、Reactのライフサイクルと紐付いたuseEffectとの組み合わせがとても重要です。サイズが変わるたびに正しい情報を更新し続けるためには、addEventListenerによる登録とremoveEventListenerによる登録解除を適切に実装する必要があります。これらは一見地味な部分ですが、仕組みが正しく動くために欠かせない工程であり、クリーンアップ処理を忘れずに書くことがReact開発の基本となります。 さらに、学んだカスタムフックを応用することで、デザインの切り替え、画面幅に応じたナビゲーション表示、複雑なレイアウト調整など、実務でも多用される実装へ発展できます。Reactの柔軟性を活かしながら、状態管理とイベント処理を自然な流れで扱うことで、より高品質なUIと操作性の高いアプリケーションが実現できます。

ウィンドウサイズを取得するカスタムフックの再確認


import { useState, useEffect } from "react";

function useWindowSize() {
  const [windowSize, setWindowSize] = useState({
    width: window.innerWidth,
    height: window.innerHeight
  });

  useEffect(() => {
    const updateSize = () => {
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight
      });
    };

    window.addEventListener("resize", updateSize);

    return () => {
      window.removeEventListener("resize", updateSize);
    };
  }, []);

  return windowSize;
}

export default useWindowSize;

上記のコードは、実際にウィンドウサイズを取得し続けるために必要な最低限の処理がわかりやすくまとまっています。最初のuseStateで初期値を設定し、useEffectの中でサイズ変更イベントを登録し、クリーンアップとしてイベントを解除します。これにより、コンポーネントがアンマウントされた後も不要なイベントが残らず、パフォーマンスやメモリ面でも安定した動作が実現できます。また、返り値として幅と高さの両方を返すことで、どのコンポーネントからも簡単に利用できる実用的なフックとなります。 この仕組みが理解できれば、ウィンドウサイズだけでなく、スクロール位置の取得やキーボードイベントの監視など、他のブラウザイベントもReactでわかりやすく扱えるようになり、より高度なインタラクションを作り出すことが可能になります。

先生と生徒の振り返り会話

生徒

「ウィンドウサイズをカスタムフックにまとめると、どのコンポーネントでも簡単に使えることがわかりました!イベントも自然に扱えるようになりました。」

先生

「その通りだね。カスタムフックは再利用性を高めるためのとても便利な仕組みで、Reactの開発を効率よく進めるための重要な技術だよ。」

生徒

「useEffectのクリーンアップ処理がなぜ必要なのかもよく理解できました。アンマウント後にイベントが残ってしまうのは確かに困りますね。」

先生

「そうだね。Reactではイベントや副作用を扱うときにライフサイクルを意識することが大切なんだ。今回の経験は他のフックの使い方にも役立つはずだよ。」

生徒

「はい!レスポンシブデザインにも応用できるので、実際のプロジェクトでも使ってみます!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Reactでウィンドウサイズを取得する方法はありますか?

はい、Reactではカスタムフックを使うことでウィンドウサイズをリアルタイムに取得し、どのコンポーネントからでも簡単に利用できます。
カテゴリの一覧へ
新着記事
New1
React
Reactコンポーネントの再利用と分割を完全マスター!初心者でもわかるコンポーネント設計
New2
React
ReactでAxiosインターセプターの使い方を完全ガイド!初心者でもわかるリクエストとレスポンスの処理方法
New3
React
JSXの書き方!初心者でもわかるReactタグと属性の基本ルール解説
New4
React
ReactとDockerを使った開発環境構築の基本を徹底解説!初心者でもわかるReactとDockerの連携方法
人気記事
No.1
Java&Spring記事人気No1
React
ReactでonChangeイベントを使ってフォーム入力値を管理する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
React
ReactとTypeScriptの環境構築をやさしく解説!Viteとtsconfigの設定も丁寧に紹介
No.3
Java&Spring記事人気No3
React
Reactのイベントハンドリングのアンチパターンまとめ!初心者でもわかる注意点
No.4
Java&Spring記事人気No4
React
Reactのカスタムフックの作り方を完全ガイド!再利用可能なロジックを切り出す仕組み
No.5
Java&Spring記事人気No5
React
ReactでFetch APIのローディング状態を管理する方法|初心者にもわかる解説
No.6
Java&Spring記事人気No6
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!
No.7
Java&Spring記事人気No7
React
ReactのuseStateとuseEffectでよくあるエラーと解決方法ガイド!初心者でもわかるReactフック
No.8
Java&Spring記事人気No8
React
Reactでファイルアップロードを実装する方法を解説!Fetch APIで画像やPDFを送る仕組みを初心者向けに紹介