您是否想知道 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 僅運行一次,但當我們移動滑鼠時元件仍然會更新。這是如何運作的? ?
要理解這種行為,我們需要認識到兩個獨立的系統在發揮作用:
想像一下在你的家裡設置一個安全攝影機:
讓我們一步一步看看會發生什麼:
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中文網其他相關文章!