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 と併用すると効果が高まる |
最後までご覧いただきありがとうございました。
articleReact とは? 2025 年版の特徴・強み・実務活用を一気に理解する完全解説
articleESLint を Yarn + TypeScript + React でゼロから構築:Flat Config 完全手順(macOS)
article【徹底比較】Preact vs React 2025:バンドル・FPS・メモリ・DX を総合評価
article既存 React プロジェクトを Preact に移行する完全ロードマップ
articleReact 開発を加速する GitHub Copilot 活用レシピ 20 選
articleReact vs Preact 2025 年版 - パフォーマンス・機能・エコシステム完全比較
articleZustand の状態管理を使ったカスタムフック作成術
articleJest で Hooks(useState / useEffect)をテストする方法
articleReact × TypeScript:Hooks とコンポーネントの型安全な書き方
articleuseStoreフック徹底解説:Zustandの基本操作をマスターしよう
articleReactのSuspense × useTransitionを使って滑らかなUXを実現する方法
articleReact Custom HooksのuseCallbackの基本と使い方
articleGitHub Copilot Workspace 速理解:仕様 → タスク分解 →PR までの“自動開発”体験
articleMySQL InnoDB 内部構造入門:Buffer Pool/Undo/Redo を俯瞰
articleMotion(旧 Framer Motion)で学ぶ物理ベースアニメ:バネ定数・減衰・質量の直感入門
articleJavaScript Web Animations API:滑らかに動く UI を設計するための基本と実践
articleGitHub Actions コンテキスト辞典:github/env/runner/secrets の使い分け最速理解
articlehtmx で管理画面 CRUD を 10 倍速に:一覧・検索・編集・バルク操作テンプレ
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 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来