ホームページ ウェブフロントエンド jsチュートリアル React の useMemo を理解する: その機能、いつ使用するか、ベスト プラクティス

React の useMemo を理解する: その機能、いつ使用するか、ベスト プラクティス

Sep 03, 2024 pm 01:14 PM

Understanding React

React はユーザー インターフェイスを構築するための強力なライブラリですが、アプリケーションが成長するにつれて、パフォーマンスが問題になることがあります。ここで useMemo のような React フックが役に立ちます。この記事では、useMemo の機能、いつ役立つか、および useMemo を使用する際のベスト プラクティスについて詳しく説明します。避けるべき一般的な落とし穴についても説明します。

useMemoとは何ですか?

useMemo は、計算結果をメモ化できる React フックです。簡単に言えば、関数の結果を記憶し、依存関係が変更された場合にのみ再計算します。これにより、不必要な計算が防止され、パフォーマンスが向上します。

これが基本的な例です:

import React, { useMemo } from 'react';

function ExpensiveCalculation({ num }) {
  const result = useMemo(() => {
    console.log('Calculating...');
    return num * 2;
  }, [num]);

  return <div>The result is {result}</div>;
}

ログイン後にコピー

この例では、useMemo 内の関数は、num が変更された場合にのみ実行されます。 num が同じままの場合、React は計算をスキップし、以前にメモ化された結果を使用します。

useMemoを使用する理由

useMemo を使用する主な理由は、パフォーマンスを最適化することです。 React では、コンポーネントは状態やプロパティが変更されるたびに再レンダリングされます。これにより、特に計算が複雑な場合やコンポーネント ツリーが大きい場合、高コストの計算が必要以上に頻繁に実行される可能性があります。

useMemo が特に役立ついくつかのシナリオを次に示します。

1. 高価な計算:

大規模なデータセットのフィルタリングなど、大量の計算を実行するコンポーネントがあると想像してください。 useMemo を使用しない場合、この計算はレンダリングのたびに実行されるため、アプリケーションの速度が低下する可能性があります。

import React, { useMemo } from 'react';

function ExpensiveCalculationComponent({ numbers }) {
  // Expensive calculation: filtering even numbers
  const evenNumbers = useMemo(() => {
    console.log('Filtering even numbers...');
    return numbers.filter(num => num % 2 === 0);
  }, [numbers]);

  return (
    <div>
      <h2>Even Numbers</h2>
      <ul>
        {evenNumbers.map((num) => (
          <li key={num}>{num}</li>
        ))}
      </ul>
    </div>
  );
}

// Usage
const numbersArray = Array.from({ length: 100000 }, (_, i) => i + 1);
export default function App() {
  return <ExpensiveCalculationComponent numbers={numbersArray} />;
}
ログイン後にコピー

この例では、フィルタリング操作は計算コストが高くなります。 useMemo でラップすると、レンダリングごとではなく、数値配列が変更されたときにのみ実行されます。

2. オブジェクトまたは配列の再作成を避ける

レンダリングのたびに新しい配列またはオブジェクトをプロパティとして子コンポーネントに渡すと、内容が変更されていない場合でも、不必要な再レンダリングが発生する可能性があります。 useMemo を使用して配列またはオブジェクトをメモ化できます。

import React, { useMemo } from 'react';

function ChildComponent({ items }) {
  console.log('Child component re-rendered');
  return (
    <ul>
      {items.map((item, index) => (
        <li key={index}>{item}</li>
      ))}
    </ul>
  );
}

export default function ParentComponent() {
  const items = useMemo(() => ['apple', 'banana', 'cherry'], []);

  return (
    <div>
      <h2>Fruit List</h2>
      <ChildComponent items={items} />
    </div>
  );
}
ログイン後にコピー

ここでは、item 配列が useMemo を使用してメモ化されており、ChildComponent が必要な場合にのみ再レンダリングされるようにしています。 useMemo を使用しないと、レンダリングのたびに新しい配列が作成され、子コンポーネントの不必要な再レンダリングが発生します。

3. 大規模なコンポーネントツリーの最適化

大規模なコンポーネント ツリーを操作する場合、useMemo を使用すると、特に深くネストされたコンポーネント内で負荷の高い操作の場合、不必要な再レンダリングを減らすことができます。

import React, { useMemo } from 'react';

function LargeComponentTree({ data }) {
  const processedData = useMemo(() => {
    console.log('Processing data for large component tree...');
    return data.map(item => ({ ...item, processed: true }));
  }, [data]);

  return (
    <div>
      <h2>Processed Data</h2>
      {processedData.map((item, index) => (
        <div key={index}>{item.name}</div>
      ))}
    </div>
  );
}

// Usage
const largeDataSet = Array.from({ length: 1000 }, (_, i) => ({ name: `Item ${i + 1}` }));
export default function App() {
  return <LargeComponentTree data={largeDataSet} />;
}
ログイン後にコピー

この例では、useMemo を使用して、コンポーネントでレンダリングする前に大規模なデータセットを処理します。処理されたデータをメモ化することで、コンポーネントは元のデータプロパティが変更された場合にのみデータを再計算し、不必要な再処理を回避し、パフォーマンスを向上させます。

使用上のベストプラクティスメモ

useMemo は強力なツールですが、正しく使用することが重要です。以下にいくつかのベストプラクティスを示します:

  1. パフォーマンスの最適化に使用します: 高価な計算は、いつ useMemo を使用するかを示す良い例です。数値と乗算器の状態変数に応じて、潜在的にコストのかかる演算 (配列の合計とその結果の乗算) を実行します。
const expensiveCalculation = useMemo(() => {
  console.log('Calculating sum...');
  return numbers.reduce((acc, num) => acc + num, 0) * multiplier;
}, [numbers, multiplier]);
ログイン後にコピー

この計算は数値または乗数が変更された場合にのみ再実行され、他の再レンダリングで不要な再計算を節約できる可能性があります。

  1. 依存関係を正確に保つ: PriceCalculation の useMemo フックの依存関係配列に数値と乗数の両方が含まれていることに注目してください。これにより、これらの値のいずれかが変更されるたびに計算が再実行されます。
}, [numbers, multiplier]);  // Correct dependencies
ログイン後にコピー

依存関係から乗数を省略した場合、乗数が変更されたときに計算が更新されず、不正確な結果が得られます。

  1. useMemo を使いすぎないでください: simpleValue の例は、useMemo の不必要な使用を示しています。
const simpleValue = useMemo(() => {
  return 42;  // This is not a complex calculation
}, []);  // Empty dependencies array
ログイン後にコピー

値は定数であり、計算は簡単であるため、このメモ化は不要です。パフォーマンス上の利点はなく、複雑さが増します。

  1. 使用すべきではない場合を理解してください: handleClick 関数は、useMemo を使用しない場合の良い例です。
const handleClick = () => {
  console.log('Button clicked');
};
ログイン後にコピー

この関数はシンプルで、重い計算は必要ありません。これをメモ化すると、パフォーマンスが大幅に向上することなく、コードが不必要に複雑になります。

これらのベスト プラクティスに従うことで、useMemo を効果的に使用して、コードを過度に複雑にしたり、不適切な依存関係管理による潜在的なバグを導入したりすることなく、React コンポーネントを最適化できます。

避けるべきよくある落とし穴

useMemo は優れたツールですが、注意すべきよくある間違いがいくつかあります。

  1. 依存関係の無視: 配列に依存関係を含めるのを忘れると、メモ化された値が古くなり、バグが発生する可能性があります。メモ化された関数内で使用されるすべての変数が依存関係配列に含まれていることを常に再確認してください。

  2. どこでも useMemo を使用する: すべての関数や値をメモ化する必要はありません。コードにパフォーマンスの問題がない場合、useMemo を追加しても状況は改善されません。実際、メモ化のオーバーヘッドにより処理がわずかに遅くなる可能性があります。

  3. 再レンダリングの誤解: useMemo は、コンポーネントのレンダリング プロセス全体ではなく、メモ化された計算のみを最適化します。コンポーネントが新しい props または state をまだ受け取っている場合は、メモ化された値が変更されていなくても、コンポーネントは再レンダリングされます。

結論

useMemo は React アプリケーションのパフォーマンスを最適化するための強力なフックですが、賢明に使用する必要があります。実際のパフォーマンスのボトルネックがある場所での使用に重点を置き、依存関係が正しいことを常に確認してください。これらのベスト プラクティスに従うことで、よくある落とし穴を回避し、プロジェクトで useMemo を最大限に活用できます。

以上がReact の useMemo を理解する: その機能、いつ使用するか、ベスト プラクティスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScript通訳者とコンパイラにおけるC/Cの役割 JavaScript通訳者とコンパイラにおけるC/Cの役割 Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

Python vs. JavaScript:ユースケースとアプリケーションと比較されます Python vs. JavaScript:ユースケースとアプリケーションと比較されます Apr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

See all articles