これらは両方とも React の最適化フックですが、目的は少し異なります。
詳しく見てみましょう:
1.目的:
2.返される内容:
3.使用例:
4.構文:
const memoizedCallback = useCallback( () => { doSomething(a, b); }, [a, b], ); const memoizedValue = useMemo( () => computeExpensiveValue(a, b), [a, b] );
5.パフォーマンスへの影響:
違いを説明するためにいくつかの例を見てみましょう:
useCallback の使用例:
import React, { useState, useCallback } from 'react'; const ParentComponent = () => { const [count, setCount] = useState(0); const handleClick = useCallback(() => { setCount(count + 1); }, [count]); return ( <div> <ChildComponent onClick={handleClick} /> <p>Count: {count}</p> </div> ); }; const ChildComponent = React.memo(({ onClick }) => { console.log('ChildComponent rendered'); return <button onClick={onClick}>Increment</button>; });
この例では、useCallback を使用して handleClick 関数をメモ化します。 ChildComponent は React.memo でラップされているため、これは便利です。つまり、props が変更された場合にのみ再レンダリングされます。 useCallback を使用することで、handleClick がレンダリング間で同じ参照を維持し (カウントが変更されない限り)、ChildComponent の不必要な再レンダリングを防ぎます。
useMemo の使用例:
import React, { useState, useMemo } from 'react'; const ExpensiveComponent = ({ list }) => { const sortedList = useMemo(() => { console.log('Sorting list'); return [...list].sort((a, b) => a - b); }, [list]); return ( <div> <h2>Sorted List:</h2> {sortedList.map(item => <div key={item}>{item}</div>)} </div> ); }; const ParentComponent = () => { const [list] = useState([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]); const [count, setCount] = useState(0); return ( <div> <ExpensiveComponent list={list} /> <button onClick={() => setCount(count + 1)}> Clicked {count} times </button> </div> ); };
この例では、並べ替えられたリストをメモ化するために useMemo が使用されています。コストのかかる並べ替え操作は、ExpensiveComponent のレンダリングごとではなく、リスト プロパティが変更されたときにのみ実行されます。 ParentComponent はリストに関係のない理由 (カウントが変更された場合など) で再レンダリングされる可能性があり、リストを不必要に再ソートしたくないため、これはここで特に役立ちます。
重要なポイント:
このようなコンテンツをもっと見るにはフォローしてください!
以上がReact : useCallback と useMemoの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。