useMemo と useCallback は 2 つの強力な React フックで、不必要な再レンダリングを防止してコンポーネントのパフォーマンスを最適化する上で重要な役割を果たします。これらは、開発者が応答性が高く効率的な React アプリケーションを作成するために不可欠なツールです。
このガイドでは、useMemo と useCallback の類似点と相互の違いについて詳しく説明します。それらを実装する方法と、それぞれをいつ使用するかを理解します。
通常、React ではほとんどの計算が高速ですが、非常に大きな配列の計算や、再レンダリングのたびに実行する必要のない高価な計算が必要になる場合があります。
useMemo フックと useCallback フックは、再レンダリングの間に高価な計算をキャッシュすることで、この問題の解決に役立ちます。
useMemo は再レンダリング間の計算結果をキャッシュする React フックで、2 つの引数を取ります:
再レンダリングの間に計算をキャッシュするには、コンポーネントのトップレベルで useMemo フックをラップします。
useMemo(fn, 依存関係)
const App = () => { const useMemo(() => { filterTodo(todos, tab) }, [todos, tab]) return(...) } export default App
useMemo の最初のパラメーターはパラメーターのない関数であることに注意してください。
初めて React は useMemo の最初のパラメーターの結果値を計算し、次に依存関係のリストである 2 番目のパラメーターをメモ化します。 React は、再レンダリングの間に計算結果をキャッシュし、依存関係の値の 1 つが変更された場合にのみ結果を再計算します。
useCallback フックは useMemo フックと同じですが、このフックは値を計算せずに関数 (useCallback の最初のパラメーター) をキャッシュする点が異なります。また、この関数は useMemo.
とは異なり、パラメーターを受け入れることができます。useCallback を使用するには、パラメータを渡す必要があります:
const queuedFn = useCallback(fn, 依存関係)
import { useCallback } from 'react'; export default function ProductPage({ productId }) { const handleSubmit = useCallback((orderDetails) => { post('/product/' productId '/buy', { referrer, orderDetails, }); }, [productId, referrer]);
計算結果の最適化を主に考慮している場合は、useMemo を使用してください。
関数の変更による不必要な再レンダリングの防止を主に考慮している場合は、 useCallback.
場合によっては、親コンポーネントを再レンダリングする必要があり、その結果、子コンポーネントも再レンダリングされます。 memo.
を使用してコンポーネントをキャッシュすることができます。テーマ状態を持つ Todolist コンポーネントと、子として List コンポーネントがあると仮定します。テーマの状態が変化するたびに、リスト コンポーネントが再レンダリングされますが、これは必要ありません。この問題を解決するには、memo.
を使用してください。List の機能コンポーネントをメモでラップします。
export default function TodoList({ todos, tab, theme }) { // ... return (); }
import { memo } from 'react'; const List = memo(function List({ items }) { // ... });
この包括的なガイドでは、useMemo フックと useCallback フック、それぞれの使用方法、それぞれをいつ使用するかを理解し、React アプリケーションのパフォーマンスを最適化するための利点について説明しています。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3