ホームページ ウェブフロントエンド jsチュートリアル React の使用コールバック フックの詳細: ディープ ダイブ

React の使用コールバック フックの詳細: ディープ ダイブ

Sep 12, 2024 am 10:32 AM

Exploring React

React アプリケーションは、特にサイズと複雑さが増大するにつれて、最高のパフォーマンスを必要とします。前回の記事では、計算値をメモ化し、不必要な再計算を回避するための重要なフックである useMemo について説明しました。 useMemo に詳しくない場合、または理解を深めたい場合は、「React の useMemo を理解する」を参照すると、理解を深めてアプリケーションの効率を最適化するための貴重な洞察が得られます。この記事を確認すると、パフォーマンスを向上させるための強固な基礎と実践的なヒントが得られます。

この記事では、useMemo の兄弟フックである useCallback に焦点を当て、それが React コンポーネントの最適化にどのように貢献するかを検討します。 useMemo は通常、関数の結果をメモ化するために使用されますが、useCallback は関数全体をメモ化するように設計されています。その機能と useMemo との違いを詳しく見てみましょう。

useCallbackとは何ですか?

その核となる useCallback は関数をメモ化する React フックで、依存関係が変わらない限り、すべてのレンダリングで関数の同じインスタンスが返されるようにします。これにより、不要な関数の再作成を防ぐことができ、関数を props として子コンポーネントに渡す場合に特に役立ちます。

これが基本的な例です:

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

function Parent() {
  const [count, setCount] = useState(0);

  const handleClick = useCallback(() => {
    console.log("Button clicked!");
  }, []);

  return (
    <div>
      <button onClick={handleClick}>Click me</button>
      <p>You've clicked {count} times</p>
    </div>
  );
}
ログイン後にコピー

この例では、handleClick がメモ化されています。依存関係がない場合、コンポーネントがアンマウントされない限り再作成されません。 useCallback を使用しない場合、ロジックが変更されていない場合でも、この関数はレンダリングのたびに再作成されます。

useCallback は useMemo とどう違うのですか?

useCallback は関数をメモ化しますが、useMemo は関数の実行結果をメモ化します。したがって、不必要な計算や操作を避けることだけを考えている場合は、useMemo の方が適しているかもしれません。ただし、レンダリングのたびに新しい関数参照を渡すことを避けたい場合は、useCallback を使用するツールです。

useCallbackの使用例

  1. 子コンポーネントの不必要な再レンダリングの回避 useCallback の一般的なシナリオは、関数を props として子コンポーネントに渡す場合です。 React は、新しい関数参照が渡された場合など、プロパティが変更された場合に子コンポーネントを再レンダリングします。 useCallback を使用すると、依存関係が変更されない限り、同じ関数インスタンスが確実に渡されます。
import React, { useState, useCallback } from 'react';

function Child({ onClick }) {
  console.log("Child component rendered");
  return <button onClick={onClick}>Click me</button>;
}

export default function Parent() {
  const [count, setCount] = useState(0);

  const handleClick = useCallback(() => {
    console.log("Button clicked!");
  }, []);

  return (
    <div>
      <Child onClick={handleClick} />
      <button onClick={() => setCount(count + 1)}>Increase count</button>
    </div>
  );
}
ログイン後にコピー

ここでは、handleClick 関数がメモ化されており、親コンポーネントの状態が変化したときに子コンポーネントが不必要に再レンダリングされるのを防ぎます。 useCallback を使用しないと、毎回新しい関数参照が渡されるため、親コンポーネントが変更されるたびに子コンポーネントが再レンダリングされます。

useMemo との違いは何ですか?

同様のシナリオでは、関数ロジックの結果 (関数自体ではない) を子に渡す必要がある場合に useMemo が使用されます。たとえば、レンダリングのたびに再計算するのを避けるために、負荷の高い計算をメモ化します。

  1. リスト内のイベント ハンドラーの処理 コンポーネントのリストをレンダリングする場合、useCallback は、React がレンダリングのたびに新しいイベント ハンドラーを作成するのを防ぐのに役立ちます。
import React, { useState, useCallback } from 'react';

function ListItem({ value, onClick }) {
  return <li onClick={() => onClick(value)}>{value}</li>;
}

export default function ItemList() {
  const [items] = useState([1, 2, 3, 4, 5]);

  const handleItemClick = useCallback((value) => {
    console.log("Item clicked:", value);
  }, []);

  return (
    <ul>
      {items.map(item => (
        <ListItem key={item} value={item} onClick={handleItemClick} />
      ))}
    </ul>
  );
}
ログイン後にコピー

このシナリオでは、useCallback により、handleItemClick 関数がレンダリング間で同じままであることが保証され、各リスト項目に対する関数の不必要な再作成が防止されます。

useMemo との違いは何ですか?

イベント ハンドラーを渡す代わりに、項目 (リスト内の値の合計など) に基づいて結果を計算する場合は、useMemo の方が適しています。 useMemo は計算された値をメモ化するために使用されますが、useCallback は厳密に関数用です。

コールバックの使用に関するベスト プラクティス

  1. 必要な場合にのみ使用してください useCallback の最大の落とし穴の 1 つは、使いすぎることです。関数が単純で外部変数に依存しない場合は、メモ化する必要がない可能性があります。 useCallback を使用すると、パフォーマンスが大幅に向上することなく、複雑さが不必要に追加されます。
// Unnecessary use of useCallback
const simpleFunction = useCallback(() => {
  console.log("Simple log");
}, []);
ログイン後にコピー

このような場合、依存関係や計算オーバーヘッドがないため、関数をメモ化する必要はありません。

  1. 依存関係を正確に保つ useMemo と同様に、useCallback は依存関係配列に依存して、メモ化された関数をいつ更新するかを決定します。依存関係が関数内で使用される値を正確に反映していることを常に確認してください。
const handleClick = useCallback(() => {
  console.log("Clicked with count:", count);
}, [count]); // `count` is a dependency here
ログイン後にコピー

必要な依存関係が省略されている場合、メモ化された関数は古い値を使用するため、潜在的なバグが発生します。

結論

useCallback と useMemo はどちらも React のパフォーマンスを最適化するための貴重なツールですが、目的は異なります。高価な計算の結果をメモ化する必要がある場合は useMemo を使用し、レンダリング間で関数参照が安定していることを確認する必要がある場合は useCallback を使用します。それぞれの違いとユースケースを理解することで、React アプリケーションを効果的に最適化できます。

useMemo についてさらに詳しく知りたい場合は、こちらの記事全文を必ずご覧ください: React の useMemo について理解する

以上がReact の使用コールバック フックの詳細: ディープ ダイブの詳細内容です。詳細については、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

JavaScriptの文字列文字を交換します JavaScriptの文字列文字を交換します Mar 11, 2025 am 12:07 AM

JavaScriptの文字列文字を交換します

jQuery日付が有効かどうかを確認します jQuery日付が有効かどうかを確認します Mar 01, 2025 am 08:51 AM

jQuery日付が有効かどうかを確認します

jQueryは要素のパディング/マージンを取得します jQueryは要素のパディング/マージンを取得します Mar 01, 2025 am 08:53 AM

jQueryは要素のパディング/マージンを取得します

10 jQuery Accordionsタブ 10 jQuery Accordionsタブ Mar 01, 2025 am 01:34 AM

10 jQuery Accordionsタブ

10 jqueryプラグインをチェックする価値があります 10 jqueryプラグインをチェックする価値があります Mar 01, 2025 am 01:29 AM

10 jqueryプラグインをチェックする価値があります

ノードとHTTPコンソールを使用したHTTPデバッグ ノードとHTTPコンソールを使用したHTTPデバッグ Mar 01, 2025 am 01:37 AM

ノードとHTTPコンソールを使用したHTTPデバッグ

カスタムGoogle検索APIセットアップチュートリアル カスタムGoogle検索APIセットアップチュートリアル Mar 04, 2025 am 01:06 AM

カスタムGoogle検索APIセットアップチュートリアル

jQueryはscrollbarをdivに追加します jQueryはscrollbarをdivに追加します Mar 01, 2025 am 01:30 AM

jQueryはscrollbarをdivに追加します

See all articles