React的合成事件(SyntheticEventt)

文章目錄

  • 前言


前言

React的合成事件(SyntheticEvent)是React為了統一不同瀏覽器的事件處理行為而封裝的一套跨瀏覽器事件系統。它與原生事件的主要區別如下:


1. 事件綁定方式
? 合成事件:使用駝峰命名法綁定事件(如onClick),并通過JSX直接傳遞給組件。

  <button onClick={handleClick}>點擊</button>

? 原生事件:通過addEventListener或HTML屬性(小寫命名,如onclick)綁定。

  button.addEventListener('click', handleClick);

2. 事件委托機制
? 合成事件:React將事件委托到根節點(如React 17 之前是 document,React 17+的root節點),通過事件冒泡捕獲子組件的事件,而非直接綁定到目標元素。這減少了內存消耗,并簡化了動態元素的處理。

? 原生事件:直接綁定到具體元素,可能因頻繁的元素增刪導致內存問題。


3. 事件對象
? 合成事件:接收的是SyntheticEvent對象,封裝了原生事件對象,統一了跨瀏覽器的屬性(如e.targete.stopPropagation())。

? 原生事件:直接使用瀏覽器提供的Event對象,不同瀏覽器的行為和屬性可能存在差異。


4. 事件池(Event Pooling)
? 合成事件:事件對象會被重用(出于性能考慮),異步代碼中訪問事件屬性需調用e.persist()

handleClick = (e) => {e.persist(); // 保留事件對象setTimeout(() => console.log(e.target), 100);
};

? 原生事件:事件對象不會被重用,可直接在異步代碼中使用。


5. 事件傳播與阻止冒泡
? 合成事件:e.stopPropagation()僅阻止合成事件的傳播,不影響原生事件。

? 原生事件:e.stopPropagation()會阻止事件的捕獲/冒泡,可能導致React合成事件無法觸發(如果事件未冒泡到根節點)。


6. 執行順序
? 同級事件:直接綁定在元素上的原生事件先于合成事件執行。

? 父子元素:

  1. 原生捕獲階段事件(如addEventListener('click', handler, true))。
  2. 合成捕獲階段事件(如onClickCapture)。
  3. 原生冒泡階段事件。
  4. 合成冒泡階段事件。

7. 自動綁定管理
? 合成事件:React在組件掛載/卸載時自動處理事件綁定與解綁。

? 原生事件:需手動通過removeEventListener解綁,否則可能導致內存泄漏。


8. 兼容性
? 合成事件:統一處理瀏覽器兼容性問題(如IE的event.targetevent.srcElement差異)。

? 原生事件:需開發者自行處理兼容性。


9. 事件類型覆蓋
? 合成事件:支持常見事件(如onChangeonMouseEnter),但特殊事件(如resize)需通過原生事件處理。

? 原生事件:支持所有瀏覽器事件。


示例:混合使用時的行為

function App() {const handleSyntheticClick = () => console.log("合成事件");const handleNativeClick = () => console.log("原生事件");useEffect(() => {document.addEventListener("click", handleNativeClick);return () => document.removeEventListener("click", handleNativeClick);}, []);return <button onClick={handleSyntheticClick}>按鈕</button>;
}

點擊按鈕時,輸出順序為:

  1. 原生事件(直接綁定在document上的冒泡階段事件)。
  2. 合成事件(通過React根節點委托處理)。

總結
React合成事件通過封裝原生事件,提供了跨瀏覽器一致性、性能優化和便捷的事件管理,但在混合使用時需注意執行順序和事件傳播的影響。對于特殊場景(如非冒泡事件scroll),仍需依賴原生事件處理。

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

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

相關文章

報表控件stimulsoft教程:如何在報表和儀表板中創建熱圖

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于創建報表和儀表板的通用工具集。該產品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他環境的完整工具集。無需比較產品功能&#xff0c;Stimulsoft Ultimate包含了…

[免費]蒼穹微信小程序外賣點餐系統修改版(跑腿點餐系統)(SpringBoot后端+Vue管理端)【論文+源碼+SQL腳本】

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的微信小程序醫院預約掛號管理系統(uni-appSpringBoot后端Vue管理端)&#xff0c;分享下哈。 項目視頻演示 【免費】蒼穹微信小程序外賣點餐系統修改版(跑腿點餐系統)(SpringBoot后端Vue管理端) Java畢業設計…

Dify 快速上手 MCP!Java 搭建 MCP Server 接入 Dify詳細實戰攻略

近期&#xff0c;MCP協議在AI領域熱度飆升&#xff0c;成為眾多開發者和行業人士熱議的焦點。下文先介紹MCP究竟是什么&#xff1f;再詳細講下 Dify DeepSeek Java開發 MCP server 實戰。 一、MCP的基本概念 MCP&#xff0c;全稱為模型上下文協議&#xff08;Model Context P…

力扣992做題筆記

左神做法的理論依據 我們可以通過 集合的包含關系 和 具體示例枚舉 來直觀理解這一推導過程。以下結合題目示例 1 進行詳細說明&#xff1a; 示例 1 分析 輸入&#xff1a;nums [1,2,1,2,3], k 2 目標&#xff1a;計算恰好包含 2 種不同整數 的子數組個數。 步驟一集合 A…

Kubernetes 運維操作手冊:從 etcd 快照進行精確恢復

1 5 步實現 etcd 精確恢復 將快照恢復到本地 etcd 數據目錄。使用恢復的數據啟動本地 etcd 實例。使用 etcdctl 查詢特定鍵&#xff08;例如&#xff0c;ConfigMap&#xff09;。使用 auger 解碼以提取干凈的 YAML。使用 kubectl 申請恢復到您的實時集群。 本指南將指導您從 et…

LeetCode Hot100刷題——合并區間

56. 合并區間 以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1&#xff1a; 輸入&#xff1a;i…

《Metasploit框架核心模塊解析與安全防護實踐》?

目錄 ??一、框架模塊化設計與安全驗證價值?? ??1. 漏洞驗證模塊&#xff08;Exploit Modules&#xff09;?? ??2. 安全評估模塊&#xff08;Auxiliary Modules&#xff09;?? ??3. 安全響應模塊&#xff08;Post-Exploitation&#xff09;?? ??4. 載荷安全…

Cribl 中 Parser 扮演著重要的角色 + 例子

先看文檔: Parser | Cribl Docs Parser The Parser Function can be used to extract fields out of events or reserialize (rewrite) events with a subset of fields. Reserialization will preserve the format of the events. For example, if an event contains comma…

程序設計實踐--排序(1)

&#xff11;、插入排序&#xff08;一個數組&#xff09; #include<bits/stdc.h> using namespace std; const int N1e35; int a[N]; int n; int main(){cin>>n;for(int i1;i<n;i){cin>>a[i];}for(int i1;i<n;i){int va[i];int ji-1;while(j>1&am…

MAC電腦中右鍵后復制和拷貝的區別

在Mac電腦中&#xff0c;右鍵菜單中的“復制”和“拷貝”操作在功能上有所不同&#xff1a; 復制 功能&#xff1a;在選定的位置創建一個與原始文件相同的副本。快捷鍵&#xff1a;CommandD用于在當前位置快速復制文件&#xff0c;CommandC用于將內容復制到剪貼板。效果&…

新能源汽車焊接智能節氣閥

在新能源汽車產業迅猛發展的浪潮中&#xff0c;制造工藝的優劣直接關系到車輛的性能、安全與市場競爭力。焊接&#xff0c;作為新能源汽車生產流程里的關鍵一環&#xff0c;無論是構建車身框架&#xff0c;還是連接電池模組&#xff0c;其質量的好壞都起著決定性作用。而在焊接…

Linux:面試題

1. 什么是中斷和異常&#xff1f; 中斷&#xff1a;由外部設備&#xff08;如鍵盤、網卡&#xff09;觸發的異步事件&#xff0c;用于通知 CPU 有緊急事件需要處理。 異常&#xff1a;由 CPU 內部執行指令時產生的同步事件&#xff08;如除零錯誤、缺頁異常&#xff09;&#…

linux關閉某端口暫用的進程

查看是哪個端口暫用 sudo netstat -tulpn | grep :80根據圖片 顯示 80端口暫用的 進程id是 3002 結束進程id為3002的進程 sudo kill -9 3002

【學習心得】Jupyter 如何在conda的base環境中其他虛擬環境內核

如果你在conda的base環境運行了jupyter lab打開了一個ipynb文本&#xff0c;此時選擇的內核是base虛擬環境的Python內核&#xff0c;如果我想切換成其他conda虛擬環境來運行這個文件該怎么辦&#xff1f;下面我們試著還原一下問題&#xff0c;并且解決問題。 【注】 這個問題出…

React Flow 邊的基礎知識與示例:從基本屬性到代碼實例詳解

本文為《React Agent&#xff1a;從零開始構建 AI 智能體》專欄系列文章。 專欄地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。項目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代碼示?例與實戰源&#xff09;。完整介紹…

ZooKeeper 原理解析及優劣比較

大家好&#xff0c;這里是架構資源棧&#xff01;點擊上方關注&#xff0c;添加“星標”&#xff0c;一起學習大廠前沿架構&#xff01; 引言 在分布式系統中&#xff0c;服務注冊、配置管理、分布式鎖、選舉等場景都需要一個高可用、一致性強的協調服務。Apache ZooKeeper 憑…

模糊照片變清晰:照片高清修復 ComfyUI 使用教學

模糊照片變清晰 滿心歡喜地翻出舊相冊&#xff0c;想重溫那些美好的回憶&#xff0c;結果照片卻模糊不清&#xff0c;根本看不清當年的模樣&#xff1b;又或者精心拍攝了一張超有氛圍感的照片&#xff0c;結果因為手抖或者光線問題&#xff0c;變得模糊&#xff0c;無法發朋友圈…

IEEEtran中文獻中的作者大于3個時,用et al.省略

latex&#xff1a; 在使用bib文件的時候&#xff0c;當參考文獻超過三個作者時&#xff0c;第三個作者后加逗號并接上et al.。我使用的是IEEEtran.bst。 \begingroup \small \bibliographystyle{IEEEtran} \bibliography{newbmyref1} \endgroup1.需要將IEEEtran.bst添加到這個…

Android Studio Kotlin 中的方法添加灰色參數提示

在使用 Android Studio 時&#xff0c; 我發現使用 Java 編寫方法后在調用方法時&#xff0c; 會自動顯示灰色的參數。 但在 Kotlin 中沒有顯示&#xff0c; 于是找了各種方法最后找到了設置&#xff0c; 并且以本文章記錄下來。 博主博客 https://blog.uso6.comhttps://blog.…

python寵物用品商城系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…