【ITニュース解説】"useMemoization" in reactjs
2025年09月08日に「Dev.to」が公開したITニュース「"useMemoization" in reactjs」について初心者にもわかりやすく解説しています。
ITニュース概要
Reactのメモ化は、不要な再レンダリングや計算を避ける最適化技術。React.memoはpropsが変わらない限りコンポーネントの再レンダリングを防ぐ。useMemoは計算結果を、useCallbackは関数をメモ化。依存配列に変化がなければ、キャッシュされた値を再利用し、パフォーマンスを向上させる。
ITニュース解説
Reactにおけるメモ化は、コンポーネントの不必要な再レンダリングや、コストのかかる値の再計算を防ぐための最適化テクニックだ。これは、関数やコンポーネントの入力を元に結果をキャッシュし、入力が変更されない限り、キャッシュされた結果を返すことで実現される。
React.memoは、関数コンポーネントをメモ化するために使用される高階コンポーネント(HOC)だ。コンポーネントのpropsが変更されていない場合、再レンダリングを防ぐ。例えば、MyMemoizedComponentというコンポーネントがあり、prop1とprop2をpropsとして受け取るとする。このコンポーネントをReact.memoでラップすることで、prop1またはprop2の値が変更されない限り、コンポーネントは再レンダリングされない。これにより、不必要なDOM操作を減らし、アプリケーションのパフォーマンスを向上させることができる。
useMemoフックは、コストのかかる計算の結果をメモ化するために使用される。計算は、依存関係が変更された場合にのみ再実行される。たとえば、MyComponentというコンポーネントがあり、dataというpropsを受け取るとする。expensiveValueという変数をuseMemoを使って定義し、dataを元に複雑な計算を行うとする。useMemoの第二引数に[data]を指定することで、dataの値が変更された場合にのみ、計算が再実行され、expensiveValueが更新される。dataの値が変わらない限り、以前に計算された値がキャッシュから返されるため、無駄な計算を避けることができる。
useCallbackフックは、関数をメモ化するために使用され、レンダリングごとに再生成されるのを防ぐ。これは、メモ化された子コンポーネントにコールバックをpropsとして渡す場合に特に有効で、子コンポーネントの不必要な再レンダリングを回避できる。ParentComponentという親コンポーネントがあり、handleClickという関数を定義し、ChildComponentという子コンポーネントにonClick propsとして渡すとする。useCallbackを使ってhandleClickをメモ化し、第二引数に空の配列[]を指定することで、handleClickは初期レンダリング時に一度だけ生成され、それ以降は同じ関数インスタンスが再利用される。これにより、ChildComponentがReact.memoでメモ化されている場合、onClick propsが変わらないため、不必要な再レンダリングを防ぐことができる。もしuseCallbackを使用せずにhandleClickを定義した場合、親コンポーネントが再レンダリングされるたびに新しい関数インスタンスが生成され、ChildComponentは常に再レンダリングされてしまう。
メモ化は、時間のかかる計算やリソースを大量に消費する計算の結果をメモ化する場合、安定したpropsを受け取り、再レンダリングのコストが高いコンポーネントにReact.memoを使用する場合、関数をメモ化された子コンポーネントにpropsとして渡す場合にuseCallbackを使用する場合に有効だ。メモ化を適切に使用することで、Reactアプリケーションのパフォーマンスを大幅に向上させることができる。しかし、すべてのコンポーネントや値をメモ化する必要はない。メモ化自体にもコストがかかるため、本当に必要な箇所を見極めて適用することが重要だ。