大規模な React アプリケーションでは、無駄な再レンダリングが重大な問題となり、パフォーマンスが低下し、アプリが遅く感じる可能性があります。 React 18 では、自動バッチ処理により不必要な再レンダリングが削減され、パフォーマンスが最適化され、開発者は状態の更新をより効率的に管理できるようになります。このガイドでは、React 18 の自動バッチ処理の概念、それがパフォーマンスにとって重要な理由、アプリでそれを最大限に活用する方法について説明します。
夕食の準備をしているとします。すべての料理を一度に作るのではなく、それぞれを別々に作るために何度も行ったり来たりし続けているとします。明らかに効率的ではありませんよね? React でも状態の更新が 1 つずつ処理されるときに同じことが起こり、1 つだけではなく複数のレンダリングが発生します。これは、特に大規模なアプリケーションにおいて、無駄な処理とパフォーマンスの低下につながります。
React 18 より前は、状態の更新が同時に発生すると、複数の再レンダリングが発生することがよくありました。 React 18 は、複数の更新を 1 つのレンダリング サイクルにグループ化する 自動バッチ処理 でこの問題を解決し、不必要な再レンダリングが減り、パフォーマンスが向上します。
自動バッチ処理 は、React 18 で導入された機能で、React が同じイベントまたはエフェクト内で複数の状態更新を処理し、再レンダリングを 1 回だけトリガーできるようにします。これにより、レンダリングの数が最小限に抑えられ、アプリケーションの全体的なパフォーマンスが向上します。
React 18 より前は、バッチ処理はイベント ハンドラー内でのみ適用されていました。ただし、React 18 では、バッチ処理を setTimeout、Promise、イベント リスナーなどの非同期関数内のすべての更新に拡張し、より強力かつ包括的なものにしています。
これは、React 18 で自動バッチ処理がどのように機能するかを示す例です:
import { useState } from 'react'; function MyComponent() { const [count, setCount] = useState(0); const [text, setText] = useState(''); function handleClick() { setCount(count + 1); setText('Updated'); // Both updates are batched, and only one re-render happens } return ( <div> <p>{count}</p> <p>{text}</p> <button onClick={handleClick}>Update</button> </div> ); }
上記のコードでは、カウントとテキストの状態更新がまとめてバッチ処理され、2 回ではなく 1 回の再レンダリングがトリガーされます。これは React 18 の自動バッチ処理のおかげです。
React では、状態が変化するたびに再レンダリングが発生します。イベント ハンドラーのように、複数の状態更新が次々に発生する場合、通常、React は複数のレンダリングをトリガーします。これにより、特に規模が拡大するにつれて、アプリの速度が低下する可能性があります。
自動バッチ処理は、これらの状態更新を単一のレンダー パスに結合します。複数のフィールドを含むフォームに入力していて、入力が変更されるたびにフォーム全体が再レンダリングされる場合を想像してください。自動バッチ処理により、React はこれらすべての変更を一度に処理し、UI をよりスムーズかつ高速に感じさせます。
自動バッチ処理は、次のようなさまざまな状況で機能します。
import { useState } from 'react'; function MyComponent() { const [count, setCount] = useState(0); const [text, setText] = useState(''); function handleClick() { setCount(count + 1); setText('Updated'); // Both updates are batched, and only one re-render happens } return ( <div> <p>{count}</p> <p>{text}</p> <button onClick={handleClick}>Update</button> </div> ); }
function handleSubmit() { setFormSubmitted(true); setFormData({ ...formData, submittedAt: new Date() }); // Only one re-render happens here }
これは、非同期操作であっても、React が複数の更新をグループ化して、パフォーマンスを向上させ、再レンダリングの回数を最小限に抑えることができることを意味します。
特にアニメーションや重要な UI 更新を操作する場合、状態の更新がいつ行われるかを手動で制御する必要がある場合があります。ここで flushSync が登場します。これにより、他の更新とバッチ処理する代わりに、React に更新を即座に処理させます。
React によるバッチ更新を待つのではなく、状態が更新されて DOM に即時に反映されることを確認する必要があるシナリオでは、flushSync を使用する必要があります。これは、アニメーションや瞬時の視覚的フィードバックなど、タイミングが重要な状況で必要になることがよくあります。
flushSync の仕組みは次のとおりです:
setTimeout(() => { setLoading(false); setUser({ name: 'John' }); // These state changes are batched, so only one re-render }, 1000);
この例では、React は setCount 更新をすぐに処理し、DOM に変更がすぐに反映されるようにします。これは、時間に敏感なアクションに役立ちます。
React 18 の 自動バッチ処理 は、不必要な再レンダリングを削減することでパフォーマンスを最適化し、アプリケーションをより高速かつスムーズに実行する革新的な機能です。 React は、状態の更新を 1 つのレンダリングにグループ化することで、アプリの UI がスケールしても、応答性と効率性を維持します。
ほとんどの使用例では、自動バッチ処理はそのまま使用しても完全に機能しますが、さらに制御が必要な場合は、flushSync を使用してリアルタイムで更新を処理できます。
これらの機能を活用することで、開発者は無駄なレンダリングを最小限に抑え、React アプリの全体的なパフォーマンスを向上させ、より良いユーザー エクスペリエンスを保証できるようになりました。
自動バッチ処理を使用して React アプリを最適化する準備はできましたか? 次のプロジェクトにこの機能を実装して、アプリのパフォーマンスがどれだけ向上するかを確認してください!
この記事が気に入っていただけた場合は、私の仕事をサポートすることを検討してください:
以上がReact の自動バッチ処理: 再レンダリングを最小限に抑えてパフォーマンスを向上させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。