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

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

PHPz
PHPzオリジナル
2024-09-12 10:32:01671ブラウズ

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 までご連絡ください。