ホームページ >ウェブフロントエンド >jsチュートリアル >React の useMemo フックによるパフォーマンスの最適化: 高価な計算のメモ化

React の useMemo フックによるパフォーマンスの最適化: 高価な計算のメモ化

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-23 00:26:10459ブラウズ

Optimizing Performance with React

React でメモフックを使用する

useMemo フックは、高価な計算をメモ化することでアプリケーションのパフォーマンスを最適化するのに役立つ組み込みの React フックです。これにより、特定の計算がレンダリングごとではなく、依存関係が変更された場合にのみ再実行されるようになります。これは、コンポーネントが再レンダリングされるときに、値の不必要な再計算を防ぐのに特に役立ちます。


useMemo とは何ですか?

useMemo は、高コストの関数呼び出しの結果をメモ化し、その依存関係の 1 つが変更された場合にのみそれを再計算するために使用されます。これにより、レンダリングごとにコストのかかる再計算が回避され、パフォーマンスが向上します。


useMemo の構文

const memoizedValue = useMemo(() => expensiveFunction(param1, param2), [param1, param2]);
  • expensiveFunction(param1, param2): 負荷の高い計算を実行する関数。
  • memoizedValue: CostFunction の結果。依存関係が変更された場合にのみ再計算されます。
  • [param1, param2]: 依存関係の配列。メモ化された値は、これらの値のいずれかが変更された場合にのみ再計算されます。

メモの使い方

  1. メモ化: useMemo フックは計算の結果を保存し、最後のレンダリング以降依存関係が変更されていない場合は保存された結果を返します。
  2. 再計算: 依存関係のいずれかが変更された場合、計算が再実行され、新しい結果が返されます。

メモフック使用例

計算が遅い簡単な例を考えてみましょう:

import React, { useState, useMemo } from 'react';

const ExpensiveComponent = () => {
  const [count, setCount] = useState(0);
  const [toggle, setToggle] = useState(false);

  const calculateExpensiveValue = (num) => {
    console.log('Calculating expensive value...');
    return num * 2;
  };

  // Memoizing the expensive function result
  const memoizedValue = useMemo(() => calculateExpensiveValue(count), [count]);

  return (
    <div>
      <h2>Expensive Calculation: {memoizedValue}</h2>
      <button onClick={() => setCount(count + 1)}>Increment Count</button>
      <button onClick={() => setToggle(!toggle)}>Toggle</button>
    </div>
  );
};

export default ExpensiveComponent;
  • 説明:

    • useMemo は、calculateExpensiveValue(count) の結果をメモ化するために使用されます。
    • 関数 CalculateExpensiveValue は、カウントが変更された場合にのみ再実行されます。トグル状態が変化しても、トグルは依存関係配列の一部ではないため、メモ化された値は再計算されません。
  • なぜここで useMemo を使用するのですか?

    • useMemo を使用しないと、トグル状態が変化して計算に影響を与えない場合でも、レンダリングのたびに高価な関数 CalculateExpensiveValue が呼び出されます。 useMemo を使用すると、負荷の高い計算が必要な場合にのみ実行されます。

useMemo を使用する場合

次の場合に useMemo を使用する必要があります。

  1. 負荷の高い計算: 実行に負荷がかかる関数や操作があり、絶対に必要な場合 (大きな配列のソートや複雑な計算など) を除き、それらの再計算を避けたい場合。

  2. 不必要な再レンダリングを避ける: 子コンポーネントに渡される値をメモ化すると、子コンポーネントの不必要な再レンダリングを防ぐことができます。メモ化された値が変更されない場合、React は子コンポーネントのレンダリングをスキップできます。

  3. パフォーマンスの最適化: ロジックの特定の部分に、特定のプロパティまたは状態のみに依存する計算が含まれる場合、useMemo は依存関係が変更された場合にのみ関数が実行されるようにすることで、パフォーマンスを最適化できます。


useMemo の一般的な使用例

  1. 高価な計算

たとえば、並べ替えやフィルター処理が必要なアイテムのリストをレンダリングしていると想像してください。この操作には負荷がかかります。

const memoizedValue = useMemo(() => expensiveFunction(param1, param2), [param1, param2]);
  • 説明: ここでは、フィルター操作はデータ配列が変更された場合にのみ実行され、他の状態値が変更された場合に不要な再レンダリングや計算が行われるのを防ぎます。
  1. 子コンポーネントの小道具をメモする

負荷の高い計算の結果である prop を受け入れる子コンポーネントがある場合、計算をメモ化し、結果を prop として渡すことができます。

import React, { useState, useMemo } from 'react';

const ExpensiveComponent = () => {
  const [count, setCount] = useState(0);
  const [toggle, setToggle] = useState(false);

  const calculateExpensiveValue = (num) => {
    console.log('Calculating expensive value...');
    return num * 2;
  };

  // Memoizing the expensive function result
  const memoizedValue = useMemo(() => calculateExpensiveValue(count), [count]);

  return (
    <div>
      <h2>Expensive Calculation: {memoizedValue}</h2>
      <button onClick={() => setCount(count + 1)}>Increment Count</button>
      <button onClick={() => setToggle(!toggle)}>Toggle</button>
    </div>
  );
};

export default ExpensiveComponent;
  1. 不必要なレンダリングの再計算の防止

コンポーネントに複数の状態値があるが、負荷の高い計算に影響するのは 1 つだけである場合、useMemo を使用して、関連する状態が変更されない限り、その値の再計算を避けることができます。


useMemo と useCallback の違い

useMemo と useCallback はどちらもメモ化に使用されますが、目的は異なります。

  • useMemo は、負荷の高い計算または関数呼び出しの結果をメモ化するために使用されます。
  • useCallback は、レンダリングのたびに関数が再作成されないように、実際の関数自体をメモ化するために使用されます。
フック 目的 使用例
Hook Purpose Example Usage
useMemo Memoizes the result of a function call or calculation Memoizing a computed value
useCallback Memoizes the function itself Preventing the creation of a new function on each render
メモを使用 関数呼び出しまたは計算の結果をメモします 計算された値をメモする コールバックを使用 関数自体をメモ化します レンダリングごとに新しい関数が作成されないようにする テーブル>

パフォーマンスに関する考慮事項

  • useMemo の過剰使用を避ける: useMemo はパフォーマンスを最適化できますが、React は依存関係とメモ化された値を追跡する必要があるため、独自のコストがかかります。場合によっては、特に単純な計算の場合、useMemo を使用しても目立ったパフォーマンスの向上が得られない可能性があります。
  • ベンチマーク: useMemo を使用する前後でコンポーネントのベンチマークを行い、特定のケースで実際にパフォーマンスが向上することを確認することが重要です。

ソート付きメモの使用例

useMemo を使用して並べ替えられたリストをメモ化する例を次に示します:

const memoizedValue = useMemo(() => expensiveFunction(param1, param2), [param1, param2]);
  • 説明:
    • この例では、sortedItems が useMemo を使用してメモ化されています。並べ替え操作は、items 配列または sortOrder 状態が変更された場合にのみ再計算されます。
    • useMemo を使用しないと、たとえ項目や sortOrder が変更されなかったとしても、並べ替えはレンダリングのたびに行われます。

メモフックの使い方概要

  • useMemo は、高価な計算をメモ化し、依存関係が変更された場合にのみ計算を再計算するために使用されます。
  • 不必要な再計算を回避することで、パフォーマンスを大幅に向上させることができます。
  • useMemo は、コストが高く、必要な場合にのみ再計算する必要がある計算または計算に使用する必要があります。

結論

useMemo フックは、React アプリケーションのパフォーマンスを最適化するために不可欠なツールです。これにより、コストのかかる計算が必要な場合にのみ実行されるようになり、コンポーネントの効率が向上します。ただし、過度に使用すると不必要な複雑さが生じ、パフォーマンスが低下する可能性があるため、慎重に使用する必要があります。


以上がReact の useMemo フックによるパフォーマンスの最適化: 高価な計算のメモ化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。