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 と併用すると効果が高まる |
最後までご覧いただきありがとうございました。
- review
今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
- review
ついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
- review
愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
- review
週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
- review
新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
- review
科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来