ホームページ >ウェブフロントエンド >jsチュートリアル >React の使用コールバック フックの詳細: ディープ ダイブ
React アプリケーションは、特にサイズと複雑さが増大するにつれて、最高のパフォーマンスを必要とします。前回の記事では、計算値をメモ化し、不必要な再計算を回避するための重要なフックである useMemo について説明しました。 useMemo に詳しくない場合、または理解を深めたい場合は、「React の useMemo を理解する」を参照すると、理解を深めてアプリケーションの効率を最適化するための貴重な洞察が得られます。この記事を確認すると、パフォーマンスを向上させるための強固な基礎と実践的なヒントが得られます。
この記事では、useMemo の兄弟フックである useCallback に焦点を当て、それが React コンポーネントの最適化にどのように貢献するかを検討します。 useMemo は通常、関数の結果をメモ化するために使用されますが、useCallback は関数全体をメモ化するように設計されています。その機能と useMemo との違いを詳しく見てみましょう。
その核となる 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 は関数の実行結果をメモ化します。したがって、不必要な計算や操作を避けることだけを考えている場合は、useMemo の方が適しているかもしれません。ただし、レンダリングのたびに新しい関数参照を渡すことを避けたい場合は、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 が使用されます。たとえば、レンダリングのたびに再計算するのを避けるために、負荷の高い計算をメモ化します。
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 は計算された値をメモ化するために使用されますが、useCallback は厳密に関数用です。
// Unnecessary use of useCallback const simpleFunction = useCallback(() => { console.log("Simple log"); }, []);
このような場合、依存関係や計算オーバーヘッドがないため、関数をメモ化する必要はありません。
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 サイトの他の関連記事を参照してください。