【実用】useMemoはどのような時に使うべきか

投稿日:2023/06/10 最終更新日:2023/06/10

【実用】useMemoはどのような時に使うべきか

Reactは、効率的なコンポーネントのレンダリングとパフォーマンスの最適化をサポートするための様々なフックを提供しています。

その中でも、useMemoフックは再計算の制御とキャッシュ機能を提供し、コンポーネントのパフォーマンス向上に役立ちます。

この記事では、useMemoフックについて詳しく説明していきます。

useMemoとは

useMemoフックは、計算に時間がかかる値をキャッシュし、依存関係の変更があった場合にのみ再計算する機能を提供します。

const hogehoge = useMemo(() => {
 // 計算処理
 return fugafuga;
}, [dependency1, dependency2]);
  • 第1引数: 計算処理を含むコールバック関数を指定します。
  • 第2引数: 依存関係の配列を指定します。この配列内の値が変更された場合にのみ再計算が行われます。

useMemoの役割

useMemoフックは、依存関係の変更がない限りキャッシュされた値を返します。

これにより、不要な再計算を避けることができます。

ただし、依存関係の配列を適切に設定することが重要です。

必要な依存関係を指定しないと、キャッシュされた値が古いままである可能性があります。

 

また、コンポーネント内の重い計算や処理を最適化するために使用されます。

例えば、大規模なデータセットのフィルタリングやソートなどの計算が含まれる場合、useMemoを使用することで再計算のオーバーヘッドを軽減できます。

こちらは次の章で詳しく解説します。

useMemoの使い所

計算結果のキャッシュ

useMemoは、重い計算や演算を含む場合に特に有用です。

例えば、大規模なデータセットのフィルタリングやソート、数値の計算などです。

これらの計算は再レンダリングごとに実行する必要はなく、結果をキャッシュして再利用することができます。

const hogehoge = useMemo(() => {
 // データのフィルタリング処理
 return data.filter(...);
}, [data]);

上記の例では、dataが変更されるたびに再計算されるのではなく、dataが変更されない限りキャッシュされた結果が返されます。

プロパティの変更に応じた処理

useMemoは、特定のプロパティの変更に対して異なる処理を行いたい場合にも役立ちます。

例えば、条件に基づいて異なるスタイルを適用する場合です。

const style = useMemo(() => {
 if (condition) {
  return { color: 'red' };
 } else {
  return { color: 'blue' };
 }
}, [condition]);

conditionが変更されるたびに再計算が行われ、異なるスタイルが適用されます。

レンダリングの最適化

useMemoは、コンポーネント内で頻繁に使用される値のキャッシュにも適しています。

これにより、余分なレンダリングが行われず、コンポーネントのパフォーマンスが向上します。

const memoizedValue = useMemo(() => expensiveComputation(), []);

上記の例では、expensiveComputationは初回のみ実行され、その後はキャッシュされた値が使用されます。

注意点と制約

useMemoフックは、パフォーマンス最適化のために使用されるべきであり、値の変更を追跡するための状態管理には向きません。

そのような場合ではuseStateやuseReducerを使用してください。

また、計算処理が簡単である場合や依存関係がない場合は、useMemoの使用は必要ないかと思いますので、値をキャッシュしない場合にレンダリング時間が伸びえてしまうような大規模なデータを扱う際に使用すべきフックになるでしょう。

まとめ

useMemoフックは計算結果のキャッシュや特定のプロパティの変更に応じた処理、レンダリングの最適化など様々な場面で有用です。

正しく使用することで、Reactコンポーネントのパフォーマンスを向上させることができます。

ただし、必要な依存関係を正確に指定することと、不要な場面での使用を避けることが重要なので注意しましょう。

参考資料

React公式ドキュメント: useMemo

React.memo vs useMemo: What’s the difference?

Optimizing Performance with React useMemo Hook