React コンポーネントがレンダリングのたびに再登録せずにアクティブなイベント リスナーをどのように維持できるか疑問に思ったことはありますか?一般的な使用例、つまりマウス座標の追跡を調べることで、この謎を解明してみましょう。
マウスの位置を追跡するこの React コンポーネントについて考えてみましょう:
import React from 'react'; function MouseCoords() { const [mousePosition, setMousePosition] = React.useState({ x: 0, y: 0, }); React.useEffect(() => { function handleMouseMove(event) { setMousePosition({ x: event.clientX, y: event.clientY, }); } window.addEventListener('mousemove', handleMouseMove); }, []); return ( <div className="wrapper"> <p> {mousePosition.x} / {mousePosition.y} </p> </div> ); } export default MouseCoords;
ここが興味深い部分です。空の依存関係配列 ([]) は、useEffect が 1 回だけ実行されることを意味しますが、マウスを動かすとコンポーネントは引き続き更新されます。これはどのように作動しますか? ?
この動作を理解するには、2 つの別個のシステムが作用していることを認識する必要があります。
自宅に防犯カメラを設置するところを想像してみてください:
何が起こるかを段階的に見てみましょう:
React.useEffect(() => { // Effect runs once on mount function handleMouseMove(event) { setMousePosition({ x: event.clientX, y: event.clientY, }); } window.addEventListener('mousemove', handleMouseMove); }, []); // Empty array = run once
マウスが動いたとき:
コンポーネントがアンマウントされるときは、常にイベント リスナーをクリーンアップする必要があります。完全なコードは次のとおりです:
React.useEffect(() => { function handleMouseMove(event) { setMousePosition({ x: event.clientX, y: event.clientY, }); } window.addEventListener('mousemove', handleMouseMove); // Cleanup function return () => { window.removeEventListener('mousemove', handleMouseMove); }; }, []);
追加機能を備えたより実用的なバージョンは次のとおりです:
import React from 'react'; function MouseCoords() { const [mousePosition, setMousePosition] = React.useState({ x: 0, y: 0, }); React.useEffect(() => { function handleMouseMove(event) { setMousePosition({ x: event.clientX, y: event.clientY, }); } window.addEventListener('mousemove', handleMouseMove); }, []); return ( <div className="wrapper"> <p> {mousePosition.x} / {mousePosition.y} </p> </div> ); } export default MouseCoords;
React の useEffect とブラウザ イベントの関係を理解することは、パフォーマンスの高い React アプリケーションを構築するために重要です。ブラウザのイベント システムを正しく活用することで、不必要な再レンダリングやイベント リスナーの登録を行わずに応答性の高いインターフェイスを作成できます。
覚えておいてください: イベント リスナーは忠実なセキュリティ カメラのようなものです。一度インストールすれば、そのまま機能します。
この説明は、useEffect とイベント リスナーについての理解を深めるのに役立ちましたか?ご意見やご質問があれば、以下にコメントを残してください!
以上がReact の useEffect とイベント リスナーを理解する: ディープダイブの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。