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

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 id="Even-Numbers">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}"></expensivecalculationcomponent>;
}

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

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

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

import React, { useMemo } from 'react';

function ChildComponent({ items }) {
  console.log('Child component re-rendered');
  return (
    
    {items.map((item, index) => (
  • {item}
  • ))}
); } export default function ParentComponent() { const items = useMemo(() => ['apple', 'banana', 'cherry'], []); return (

Fruit List

); }

ここでは、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 id="Processed-Data">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}"></largecomponenttree>;
}

この例では、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 までご連絡ください。
JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

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

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

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

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により優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

See all articles

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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