React Custom Hooksのmemoの基本と使い方
Reactアプリケーションのパフォーマンス改善において、再レンダリングの最適化は避けて通れないテーマです。
その中で登場するのが React.memo。
この関数は「同じpropsなら再描画をスキップする」という、非常に便利な仕組みを提供してくれます。
ですが、使いどころを間違えると逆にパフォーマンスが悪化したり、意図しない挙動に悩まされることもあります。
この記事では、React初心者の方にもわかりやすく React.memo の基本と応用を、実際のコード例とともに徹底解説いたします。
公式ドキュメントと併せて理解を深められる構成となっておりますので、ぜひ最後までご覧ください。
コンポーネントの再レンダリングとは
Reactは、状態(state)やpropsが変化すると、自動的にその影響を受けるコンポーネントを再レンダリングします。
この挙動自体はReactの利点でもありますが、不要なレンダリングが頻発すると、パフォーマンスに大きな影響を与える可能性があります。
例:親コンポーネントの更新による再レンダリング
tsxconst Child = () => {
console.log('Childレンダリング');
return <div>子コンポーネント</div>;
};
const Parent = () => {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(count + 1)}>カウントアップ</button>
<Child />
</div>
);
};
このコードでは、Childは自身のpropsが変わっていないにもかかわらず、Parentが更新されるたびに再レンダリングされてしまいます。
React.memoの基本的な使い方
ここで React.memo を使うと、propsが変わらない限り再レンダリングを防ぐことができます。
基本構文
tsxconst Child = React.memo(() => {
console.log('Childレンダリング');
return <div>子コンポーネント</div>;
});
このように React.memo でラップするだけで、**「propsに変化がない限り、描画されない」**状態になります。
上記の Parent コンポーネントをそのまま使った場合、Child はボタンクリック時に再描画されません。
React.memoの内部の仕組み
React.memoは、propsを**浅い比較(shallow comparison)**でチェックしています。
つまり、オブジェクトの中身までは見ません。
浅い比較の落とし穴
tsxconst Child = React.memo(({ data }) => {
console.log('Childレンダリング');
return <div>{data.value}</div>;
});
const Parent = () => {
const [count, setCount] = useState(0);
const data = { value: 'テスト' }; // 新しいオブジェクトを毎回生成
return (
<div>
<button onClick={() => setCount(count + 1)}>カウント</button>
<Child data={data} />
</div>
);
};
この例では、dataは毎回新しい参照として扱われるため、React.memoは毎回再レンダリングを実行してしまいます。
対策:useMemoを使ってpropsをメモ化
tsxconst Parent = () => {
const [count, setCount] = useState(0);
const data = useMemo(() => ({ value: 'テスト' }), []);
return (
<div>
<button onClick={() => setCount(count + 1)}>カウント</button>
<Child data={data} />
</div>
);
};
こうすることで data の参照が変わらず、React.memo の恩恵を受けられます。
React公式の解説
公式ドキュメントでは、以下のように React.memo の使いどころが説明されています:
React.memo は、パフォーマンスの最適化が必要な場面でのみ使うべきです。
つまり、むやみに使うのではなく「レンダリングが重いコンポーネント」や「再描画の頻度が高い親コンポーネントの影響を受けやすい子」に対して使うのが基本です。
表:React.memoの利点と注意点まとめ
| 項目 | 内容 |
|---|---|
| 主な効果 | propsに変化がない限り再レンダリングを防止 |
| 適用対象 | 重い処理を行うPure Component(関数コンポーネント) |
| 比較の仕組み | propsの浅い比較(shallow equality) |
| 避けるべき使い方 | 毎回新しいオブジェクト/関数をpropsとして渡すようなコンポーネント |
| 相性の良い仕組み | useCallback / useMemo と併用すると効果が高まる |
最後までご覧いただきありがとうございました。
article【緊急警告】React/Next.js の RSC 機能に CVSS 10.0 の RCE 脆弱性「CVE-2025-55182」が発覚
articleReact の最新動向まとめ:Server Components・並列レンダリング・エコシステム俯瞰
articleReact で管理画面を最短構築:テーブル・フィルタ・権限制御の実例
articleReact でデータ取得を最適化:TanStack Query 基礎からキャッシュ戦略まで実装
articleReact クリーンアーキテクチャ実践:UI・アプリ・ドメイン・データの責務分離
articleReact フック完全チートシート:useState から useTransition まで用途別早見表
articleZustand の状態管理を使ったカスタムフック作成術
articleJest で Hooks(useState / useEffect)をテストする方法
articleReact × TypeScript:Hooks とコンポーネントの型安全な書き方
articleuseStoreフック徹底解説:Zustandの基本操作をマスターしよう
articleReactのSuspense × useTransitionを使って滑らかなUXを実現する方法
articleReact Custom HooksのuseCallbackの基本と使い方
articleAnsible 実行モデル解体新書:コントローラからターゲットまでの裏側
articleACF かブロックか:WordPress 入力 UI の設計判断と移行戦略
articleTailwind CSS 本番パフォーマンス運用:CSS 分割・HTTP/2 最適化・preload 戦略
articleJava の OutOfMemoryError を根治する:ヒープ/メタスペース/スレッドの診断術
articleKubernetes で Pod が CrashLoopBackOff の原因と切り分け手順
article本番計測とトレース:Zustand の更新頻度・差分サイズを可視化して改善サイクル化
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来