React 組件中怎么做事件代理?它的原理是什么?

在 React 組件中,**事件代理(Event Delegation)**其實是 React 內部實現的一部分,開發者通常無需手動實現事件代理,但理解它的原理和使用方式對于優化性能和掌握底層機制非常重要。


一、React 中事件代理的原理

React 使用的是事件委托(事件代理)機制,其核心原理是:

React 會把所有事件監聽器統一綁定到最外層的 DOM 容器(通常是 documentroot 元素)上,通過事件冒泡捕獲所有子組件事件,然后在內部合成事件系統中進行處理。

👇 舉個例子

function App() {return (<div onClick={() => console.log('div clicked')}><button onClick={() => console.log('button clicked')}>Click me</button></div>);
}

你看到這里兩個事件監聽器其實并沒有分別綁定在 <div><button> 上的真實 DOM 上。React 會統一把監聽器注冊到容器上,比如:

<div id="root">...</div>

然后通過冒泡來判斷事件的目標,并在合適的組件上觸發回調。


二、React 的事件代理機制優勢

  • ? 性能更好:減少了事件監聽器的數量,特別是組件較多時。

  • ? 統一管理:使用合成事件(SyntheticEvent)系統做跨瀏覽器兼容處理。

  • ? 便于事件回收:當組件卸載時不需要顯式解綁 DOM 事件,React 自動管理。


三、開發者如何主動實現事件代理

雖然 React 內部已經做了事件代理,但你在某些場景中還是可能手動實現事件代理邏輯,比如動態列表中綁定事件

function List({ items }) {const handleClick = (e) => {const { dataset } = e.target;if (dataset.type === 'item') {console.log('點擊了第', dataset.index, '項');}};return (<ul onClick={handleClick}>{items.map((item, index) => (<li key={index} data-type="item" data-index={index}>{item}</li>))}</ul>);
}

? 好處:

  • 減少事件綁定次數(不需要每個 <li> 都綁定 onClick

  • 避免頻繁 re-render 時重復注冊事件


四、React 中的事件系統(補充理解)

  • React 中使用的是 SyntheticEvent(合成事件),是 React 封裝的原生事件對象。

  • 合成事件提供統一接口,并模擬了原生事件的冒泡和捕獲行為。

  • 你仍可以通過 event.nativeEvent 獲取原生事件對象。

function Example() {const handleClick = (e) => {console.log('合成事件對象', e);console.log('原生事件對象', e.nativeEvent);};return <button onClick={handleClick}>Click</button>;
}

五、常見注意事項

  • React 17+ 開始支持事件自動綁定到事件目標節點上(非 document),但默認仍使用事件委托。

  • 某些不冒泡的事件(如 onScroll)在 React 中也能正常使用,因為 React 做了特殊處理。


總結

說明
React 事件代理自動將事件統一注冊在根容器上,通過事件冒泡觸發
優勢性能高、統一管理、自動解綁
是否需要手動寫通常不需要,但某些情況(如大量元素)可手動用事件委托
合成事件SyntheticEvent 是 React 封裝的跨瀏覽器事件系統

如你希望我展示React 中事件代理 VS 原生事件委托的性能對比示例,也可以繼續擴展!需要嗎?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90867.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90867.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90867.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue 2現代模式打包:雙包架構下的性能突圍戰

文章目錄一、場景痛點&#xff1a;兼容性與性能的撕裂二、技術解析&#xff1a;Modern Mode的雙引擎驅動1. 基礎認知&#xff1a;什么是Modern Mode&#xff1f;2. 原理深入&#xff1a;HTML智能分發與Safari 10修復3. 性能收益對比表三、Vue 2項目實戰&#xff1a;啟用Modern模…

UniHttp中HttpApiProcessor生命周期鉤子介紹以及公共參數填充-以百度天氣接口為例

目錄 引言 一、UniHttp與HttpApiProcessor簡介 1、生命周期鉤子的重要性 2、公共參數填充的需求 3、生命周期鉤子相關介紹 二、HttpApiProcessor的實際應用 1、在Yml中定義相關參數 2、自定義HttpAPI注解 3、對接接口的定義 4、HttpApiProcessor的具體實現 5、實際調…

pytorch深度學習—RNN-循環神經網絡

結合生活實例&#xff0c;先簡單認識一下什么是循環神經網絡先想個問題&#xff1a;為什么需要 “循環”&#xff1f;你平時看句子、聽語音、看視頻&#xff0c;都是 “按順序” 來的吧&#xff1f;比如 “我吃蘋果” 和 “蘋果吃我”&#xff0c;字一樣但順序不同&#xff0c;…

深度學習常見名詞解釋、評價指標

目錄 一、魯棒性(robustness) 二、泛化能力&#xff08;Generalization Ability&#xff09; 核心含義&#xff1a; 如何衡量泛化能力&#xff1f; 三、先驗信息&#xff08;Prior Information&#xff09; 四、mIoU &#xff08;Mean Intersection over Union&#xff0…

docker-compose安裝常用中間件

分為3大部分&#xff1a;數據庫&#xff1a;mysql&#xff0c;redis&#xff0c;mongodb&#xff0c;elasticsearch&#xff0c;neo4j&#xff0c;minio&#xff0c;influxdb&#xff0c;canal-server應用中間件&#xff1a;nacos&#xff0c;apollo&#xff0c;zookeeper&…

基于無人機 RTK 和 yolov8 的目標定位算法

目錄 背景 算法思路 代碼實現 驗證 背景 在城市交通巡檢中如何進行車輛違停判斷很重要&#xff0c;一個方法是通過精確坐標判斷車輛中心是否位于違停框中&#xff0c;我們假設無人機坐標已知&#xff0c;并且無人機云臺鏡頭垂直地面朝下&#xff0c;可根據圖像分辨率、無人機參…

go入門 - day1 - 環境搭建

0. 介紹 go語言可以做什么&#xff1f; a. 區塊鏈 b. 分布式/微服務/云原生 c. 服務器/游戲軟件go的優勢 a. 代碼量比C和Java少 b. 編譯速度比Java或者C快上5到6倍&#xff0c;比Scale塊10被 c. 性能比C慢20%&#xff0c;但是比Java、python等快上5到10倍 d. 內存管理和C媲美&a…

【華為OD】MVP爭奪戰(C++、Java、Python)

文章目錄題目描述輸入描述輸出描述示例解題思路算法思路核心步驟代碼實現C實現Java實現Python實現算法要點復雜度分析解題總結題目描述 在星球爭霸籃球賽對抗賽中&#xff0c;最大的宇宙戰隊希望每個人都能拿到MVP&#xff0c;MVP的條件是單場最高分得分獲得者。可以并列所以宇…

Datawhale 2025 AI夏令營 MCP Server Task2

魔搭MCP &Agent賽事&#xff08;MCP Server開發&#xff09;/夏令營&#xff1a;動手開發MCP Server學習鏈接&#xff1a;魔搭MCP &Agent賽事&#xff08;MCP Server開發&#xff09; - Datawhale Task1回顧 1.task1應用功能 luner_info每日黃歷 這是一個可以獲取某天…

敏捷開發方法全景解析

核心理念:敏捷開發是以快速響應變化為核心的項目管理方法論,通過迭代式交付、自組織團隊和持續反饋,實現高質量軟件的高效交付。其本質是擁抱變化優于遵循計劃,強調"可工作的軟件高于詳盡的文檔"。 一、敏捷核心思想體系 #mermaid-svg-y7iyWsQGVWn3IpEi {font-fa…

Socket到底是什么(簡單來說)

簡單來說&#xff1a; Socket 抽象了網絡通信的復雜底層細節&#xff0c;讓應用程序開發者可以專注于發送和接收數據&#xff0c;而不用去操心數據在網絡上是如何傳輸的。 它就像一個“黑盒子”&#xff0c;你只需要把數據扔進去&#xff0c;或者從里面取數據&#xff0c;至于數…

linux系統mysql性能優化

1、系統最大打開文件描述符數查看限制 ulimit -n更改配置 # 第一步 sudo vim /etc/security/limits.conf* soft nofile 1048576 * hard nofile 1048576# 第二步 sudo vim /etc/sysctl.conffs.file-max 1048576# 第三步&#xff08;重啟系統&#xff09; sudo reboot驗證生效 u…

免費的需要嘗試claude code的API安利,截至今天可用(7月13號)

安裝方法放最后&#xff08;很簡單&#xff0c;但是你得搞定網絡&#xff09; 注冊如下&#xff1a; 鏈接如下&#xff08;有詳細說明&#xff09;&#xff1a; &#x1f680; AnyRouter&#xff5c;Claude Code 免費共享平臺 安裝&#xff08;windows用戶特殊點&#xff0…

Java 屬性配置文件讀取方法詳解

Java 屬性配置文件讀取方法詳解 一、配置文件基礎概念 1. 配置文件類型對比類型格式優點缺點適用場景Propertieskeyvalue簡單易讀&#xff0c;Java原生支持不支持層級結構簡單配置&#xff0c;JDBC參數XML標簽層級結構結構化強&#xff0c;支持復雜數據類型冗余&#xff0c;解析…

NW728NW733美光固態閃存NW745NW746

美光NW系列固態閃存深度解析&#xff1a;NW728、NW733、NW745與NW746的全方位評測技術架構與核心創新美光NW系列固態閃存&#xff08;包括NW728、NW733、NW745、NW746&#xff09;的技術根基源于其先進的G9 NAND架構。該架構通過5納米制程工藝和多層3D堆疊技術&#xff0c;在單…

【面試八股文】2025最新軟件測試面試

一、測試基礎 1、測試策略或測試包括哪些&#xff0c;測試要覆蓋哪些方面 UI、功能、性能、可靠性、易用性、兼容性、安全性、安裝卸載 2、設計測試用例的辦法 等價類、邊界值、錯誤推測法、場景法等設計方法來編寫測試用例的 &#xff08;1&#xff09;等價類分為有效等價…

AI軟件出海SEO教程

一、出海SEO核心思路 本地化&#xff1a;內容、技術、用戶體驗全面適應目標市場。關鍵詞策略&#xff1a;圍繞目標用戶的真實搜索習慣做關鍵詞挖掘和布局。內容為王&#xff1a;持續輸出高質量、解決用戶痛點的內容。技術優化&#xff1a;保證網站速度、結構、移動端體驗及安全…

PyVision:基于動態工具的具身智能體

論文地址&#xff1a; [2507.07998v1] PyVision: Agentic Vision with Dynamic Tooling 1. 背景 現有的智能體一般都是通過大模型規劃調用已經預定義好的一些工具&#xff08;具體來說也就是一些函數&#xff09;來解決問題。這樣就會導致在針對特征的任務上Agent去解決問題…

Higress 上架 KubeSphere Marketplace,助力企業構建云原生流量入口

隨著企業數字化轉型持續深化&#xff0c;云原生架構正逐漸成為構建現代應用的主流選擇。而服務治理作為云原生落地的核心能力之一&#xff0c;急需更靈活、高效的解決方案。近日&#xff0c;AI 原生的 API 網關 Higress 正式上架 KubeSphere Marketplace&#xff0c;助力用戶輕…

在LC480T上部署xapp1052

實驗環境&#xff1a;LC480T加速卡 開發環境&#xff1a;windows11vivado2020 運行環境&#xff1a;ubuntu22.04 硬件電路&#xff1a;LC480T加速卡(xc7k480tffg1156-2) vivado工程文件下載&#xff1a;https://download.csdn.net/download/xiaolangyangyang/91349686 驅動及應…