useMemo フックは、高価な計算をメモ化することでアプリケーションのパフォーマンスを最適化するのに役立つ組み込みの React フックです。これにより、特定の計算がレンダリングごとではなく、依存関係が変更された場合にのみ再実行されるようになります。これは、コンポーネントが再レンダリングされるときに、値の不必要な再計算を防ぐのに特に役立ちます。
useMemo は、高コストの関数呼び出しの結果をメモ化し、その依存関係の 1 つが変更された場合にのみそれを再計算するために使用されます。これにより、レンダリングごとにコストのかかる再計算が回避され、パフォーマンスが向上します。
const memoizedValue = useMemo(() => expensiveFunction(param1, param2), [param1, param2]);
計算が遅い簡単な例を考えてみましょう:
import React, { useState, useMemo } from 'react'; const ExpensiveComponent = () => { const [count, setCount] = useState(0); const [toggle, setToggle] = useState(false); const calculateExpensiveValue = (num) => { console.log('Calculating expensive value...'); return num * 2; }; // Memoizing the expensive function result const memoizedValue = useMemo(() => calculateExpensiveValue(count), [count]); return ( <div> <h2>Expensive Calculation: {memoizedValue}</h2> <button onClick={() => setCount(count + 1)}>Increment Count</button> <button onClick={() => setToggle(!toggle)}>Toggle</button> </div> ); }; export default ExpensiveComponent;
説明:
なぜここで useMemo を使用するのですか?
次の場合に useMemo を使用する必要があります。
負荷の高い計算: 実行に負荷がかかる関数や操作があり、絶対に必要な場合 (大きな配列のソートや複雑な計算など) を除き、それらの再計算を避けたい場合。
不必要な再レンダリングを避ける: 子コンポーネントに渡される値をメモ化すると、子コンポーネントの不必要な再レンダリングを防ぐことができます。メモ化された値が変更されない場合、React は子コンポーネントのレンダリングをスキップできます。
パフォーマンスの最適化: ロジックの特定の部分に、特定のプロパティまたは状態のみに依存する計算が含まれる場合、useMemo は依存関係が変更された場合にのみ関数が実行されるようにすることで、パフォーマンスを最適化できます。
たとえば、並べ替えやフィルター処理が必要なアイテムのリストをレンダリングしていると想像してください。この操作には負荷がかかります。
const memoizedValue = useMemo(() => expensiveFunction(param1, param2), [param1, param2]);
負荷の高い計算の結果である prop を受け入れる子コンポーネントがある場合、計算をメモ化し、結果を prop として渡すことができます。
import React, { useState, useMemo } from 'react'; const ExpensiveComponent = () => { const [count, setCount] = useState(0); const [toggle, setToggle] = useState(false); const calculateExpensiveValue = (num) => { console.log('Calculating expensive value...'); return num * 2; }; // Memoizing the expensive function result const memoizedValue = useMemo(() => calculateExpensiveValue(count), [count]); return ( <div> <h2>Expensive Calculation: {memoizedValue}</h2> <button onClick={() => setCount(count + 1)}>Increment Count</button> <button onClick={() => setToggle(!toggle)}>Toggle</button> </div> ); }; export default ExpensiveComponent;
コンポーネントに複数の状態値があるが、負荷の高い計算に影響するのは 1 つだけである場合、useMemo を使用して、関連する状態が変更されない限り、その値の再計算を避けることができます。
useMemo と useCallback はどちらもメモ化に使用されますが、目的は異なります。
Hook | Purpose | Example Usage |
---|---|---|
useMemo | Memoizes the result of a function call or calculation | Memoizing a computed value |
useCallback | Memoizes the function itself | Preventing the creation of a new function on each render |
useMemo を使用して並べ替えられたリストをメモ化する例を次に示します:
const memoizedValue = useMemo(() => expensiveFunction(param1, param2), [param1, param2]);
useMemo フックは、React アプリケーションのパフォーマンスを最適化するために不可欠なツールです。これにより、コストのかかる計算が必要な場合にのみ実行されるようになり、コンポーネントの効率が向上します。ただし、過度に使用すると不必要な複雑さが生じ、パフォーマンスが低下する可能性があるため、慎重に使用する必要があります。
以上がReact の useMemo フックによるパフォーマンスの最適化: 高価な計算のメモ化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。