最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解React合成事件

 更新時(shí)間:2026年01月22日 10:08:30   作者:全馬必破三  
React的合成事件是一個(gè)跨瀏覽器統(tǒng)一的事件系統(tǒng),它基于原生DOM事件構(gòu)建,通過封裝不同瀏覽器的事件實(shí)現(xiàn)差異,為開發(fā)者提供一致的事件處理接口,具有一定的參考價(jià)值,感興趣的可以了解一下

一、合成事件(Synthetic Event)的定義

合成事件是 React 封裝的跨瀏覽器一致的事件系統(tǒng),基于原生 DOM 事件構(gòu)建,通過抽象層屏蔽不同瀏覽器對(duì)事件的實(shí)現(xiàn)差異(如屬性定義、觸發(fā)時(shí)機(jī)、API 格式),為開發(fā)者提供統(tǒng)一、兼容的事件處理接口,無需關(guān)注瀏覽器底層實(shí)現(xiàn)細(xì)節(jié)。

二、合成事件的核心特點(diǎn)

  1. 跨瀏覽器一致性:不同瀏覽器(Chrome、Firefox、IE 等)對(duì)原生事件的實(shí)現(xiàn)存在差異,React 通過合成事件對(duì)這些差異進(jìn)行統(tǒng)一封裝,確保 onClick、onChange 等事件在所有支持的瀏覽器中,行為邏輯、API 調(diào)用方式完全一致,無需額外處理瀏覽器兼容問題。
  2. 事件池化(復(fù)用機(jī)制):React 會(huì)維護(hù)一個(gè) “事件池”,事件觸發(fā)時(shí)從池中取出事件對(duì)象,回調(diào)函數(shù)執(zhí)行完畢后,清空該對(duì)象的屬性并放回池中,供后續(xù)事件復(fù)用。這一機(jī)制大幅減少了事件對(duì)象的創(chuàng)建與銷毀開銷,降低內(nèi)存消耗;若需在異步邏輯中訪問事件屬性,需調(diào)用 e.persist() 取消池化,避免屬性被清空。
  3. 統(tǒng)一的事件接口:合成事件封裝了原生事件的核心接口,提供一致的 API 調(diào)用方式,例如 event.target(獲取觸發(fā)事件的元素)、event.preventDefault()(阻止默認(rèn)行為)、event.stopPropagation()(阻止事件冒泡)等,開發(fā)者無需適配不同瀏覽器的原生事件接口差異。

三、合成事件與原生事件的核心區(qū)別對(duì)比

維度合成事件(Synthetic Event)原生事件(Native Event)
定義React 封裝的跨瀏覽器統(tǒng)一事件系統(tǒng),基于原生 DOM 事件構(gòu)建瀏覽器自帶的原生事件系統(tǒng),遵循 DOM 事件標(biāo)準(zhǔn),無額外封裝
綁定方式直接通過組件屬性綁定(如 onClick、onKeyUp),React 自動(dòng)管理事件的綁定與解綁(組件銷毀時(shí)自動(dòng)移除)需通過 addEventListener 手動(dòng)綁定,組件銷毀或不需要時(shí)需手動(dòng)調(diào)用 removeEventListener 解綁,否則可能導(dǎo)致內(nèi)存泄漏
瀏覽器兼容性React 統(tǒng)一抹平瀏覽器差異,全瀏覽器用法、行為一致不同瀏覽器對(duì)事件的實(shí)現(xiàn)(如屬性、觸發(fā)邏輯)存在差異,需手動(dòng)編寫兼容代碼(如 IE 瀏覽器的 attachEvent 方法)
事件傳播控制調(diào)用 event.stopPropagation() 僅阻止合成事件體系內(nèi)的冒泡,不影響原生 DOM 事件的傳播;需完全阻止 DOM 事件傳播時(shí),需結(jié)合 e.nativeEvent.stopPropagation()調(diào)用 event.stopPropagation() 直接阻止原生 DOM 事件的冒泡 / 捕獲,影響整個(gè) DOM 事件流
事件對(duì)象特性事件對(duì)象池化復(fù)用,回調(diào)執(zhí)行后屬性會(huì)被清空每次事件觸發(fā)都會(huì)創(chuàng)建新的事件對(duì)象,回調(diào)執(zhí)行后隨垃圾回收機(jī)制銷毀
性能表現(xiàn)基于 “事件委托”(所有合成事件統(tǒng)一委托到 document 或根節(jié)點(diǎn))+ 事件池化,減少 DOM 監(jiān)聽器數(shù)量和內(nèi)存開銷,性能更優(yōu)大量節(jié)點(diǎn)綁定事件時(shí)(如長列表),會(huì)創(chuàng)建過多 DOM 監(jiān)聽器,增加內(nèi)存消耗和 DOM 操作開銷,可能導(dǎo)致性能下降

事件池是什么?存放在什么地方?

1. 事件池是什么?

事件池是 React 內(nèi)部維護(hù)的一個(gè)「事件對(duì)象緩存容器」,本質(zhì)是一個(gè) JavaScript 數(shù)組(或類數(shù)組結(jié)構(gòu)),里面存放著多個(gè) “被初始化但暫時(shí)閑置” 的合成事件對(duì)象(SyntheticEvent 實(shí)例)。

它的核心目的是 “復(fù)用事件對(duì)象” —— 避免每次觸發(fā)事件時(shí)都創(chuàng)建新的事件對(duì)象(創(chuàng)建 / 銷毀對(duì)象會(huì)消耗內(nèi)存和性能),就像餐廳的 “餐具消毒柜”:餐具(事件對(duì)象)用完后消毒重置(清空屬性),下次客人(新事件)來直接取用,不用每次都買新餐具。

2. 事件池存放在什么地方?

事件池是 React 內(nèi)部的 “全局級(jí) / 模塊級(jí)變量”,存放在瀏覽器的 內(nèi)存(堆內(nèi)存) 中,完全由 React 框架自己管理,開發(fā)者無法直接訪問或修改這個(gè)池。

簡單說:它是 React 內(nèi)部的 “私有緩存區(qū)”,只在 React 處理事件時(shí)生效,和我們寫的組件、DOM 元素沒有直接關(guān)聯(lián)。

為什么只能在回調(diào)內(nèi)訪問事件對(duì)象屬性,異步不行?

核心原因是 “事件池的復(fù)用機(jī)制導(dǎo)致事件對(duì)象被‘清空重置’”,我們一步步拆解流程,結(jié)合代碼示例更直觀:

1. 合成事件的完整工作流程(關(guān)鍵?。?/h3>
// 示例代碼:合成事件回調(diào) + 異步操作
<button onClick={(e) => {
  // 同步訪問:正常拿到屬性
  console.log('同步訪問 e.target', e.target); // 輸出:<button>元素

  // 異步操作:setTimeout 是異步,回調(diào)執(zhí)行完才觸發(fā)
  setTimeout(() => {
    console.log('異步訪問 e.target', e.target); // 輸出:null/undefined
  }, 100);
}}>點(diǎn)擊</button>

對(duì)應(yīng)的 React 內(nèi)部流程:

  1. 事件觸發(fā):你點(diǎn)擊按鈕,React 捕獲到原生事件;
  2. 從池取對(duì)象:React 從事件池里拿出一個(gè) “閑置的合成事件對(duì)象”(SyntheticEvent 實(shí)例);
  3. 賦值屬性:React 把當(dāng)前事件的信息(如 target、typepreventDefault 等)賦值給這個(gè)對(duì)象;
  4. 執(zhí)行你的回調(diào):把這個(gè) “有屬性的事件對(duì)象 e” 傳給你寫的 onClick 回調(diào),此時(shí)同步代碼能正常訪問 e.target
  5. 回調(diào)執(zhí)行完畢:React 立刻做兩件事 ——① 清空這個(gè)事件對(duì)象的 所有屬性(把 e.target、e.type 等都設(shè)為 null/undefined);② 把這個(gè) “空屬性的事件對(duì)象” 放回事件池,等待下次復(fù)用;
  6. 異步操作執(zhí)行:100ms 后 setTimeout 觸發(fā),但此時(shí)事件對(duì)象已經(jīng)被清空并放回池了,所以訪問 e.target 只能拿到 null。

2. 一句話總結(jié)核心邏輯:

異步操作的執(zhí)行時(shí)機(jī),晚于事件對(duì)象被 “清空重置” 的時(shí)機(jī) —— 你的異步代碼(如 setTimeoutPromise.then)是在 React 把事件對(duì)象 “清空放回池” 之后才執(zhí)行的,自然拿不到任何屬性。

3. 如何解決?(補(bǔ)充實(shí)用知識(shí)點(diǎn))

如果確實(shí)需要在異步操作中訪問事件對(duì)象,可調(diào)用 e.persist() 方法:

<button onClick={(e) => {
  e.persist(); // 關(guān)鍵:告訴 React 不要清空這個(gè)事件對(duì)象,也不要放回池
  console.log('同步訪問 e.target', e.target); // 正常輸出

  setTimeout(() => {
    console.log('異步訪問 e.target', e.target); // 正常輸出!
  }, 100);
}}>點(diǎn)擊</button>

e.persist() 的作用:把事件對(duì)象從事件池中 “移除”,讓它變成一個(gè)普通的 JavaScript 對(duì)象,不再被 React 管理(不會(huì)被清空、不會(huì)被復(fù)用),后續(xù)異步操作就能正常訪問屬性了。

核心要點(diǎn)回顧

  1. 事件池:React 內(nèi)部維護(hù)的 “事件對(duì)象緩存池”(內(nèi)存中的數(shù)組),目的是復(fù)用事件對(duì)象、減少內(nèi)存消耗;
  2. 存放位置:瀏覽器內(nèi)存(堆內(nèi)存),React 私有,開發(fā)者無法直接操作;
  3. 異步不能訪問的原因:事件回調(diào)執(zhí)行完畢后,React 會(huì)清空事件對(duì)象屬性并放回池,異步操作觸發(fā)時(shí),對(duì)象已被 “重置”,自然拿不到屬性;
  4. 解決方案:需要異步訪問時(shí),調(diào)用 e.persist() 脫離事件池管理。

四、合成事件的優(yōu)勢(shì)價(jià)值

  1. 提升開發(fā)效率:統(tǒng)一的 API 接口和跨瀏覽器兼容性,讓開發(fā)者無需關(guān)注瀏覽器底層事件差異,無需編寫兼容代碼,可專注于業(yè)務(wù)邏輯開發(fā),降低開發(fā)成本。
  2. 優(yōu)化應(yīng)用性能:事件委托機(jī)制減少了 DOM 監(jiān)聽器的數(shù)量,避免大量事件綁定導(dǎo)致的性能損耗;事件池化復(fù)用事件對(duì)象,降低了內(nèi)存創(chuàng)建與銷毀的開銷,提升應(yīng)用響應(yīng)速度。
  3. 增強(qiáng)穩(wěn)定性:通過抽象層屏蔽瀏覽器事件實(shí)現(xiàn)的差異,避免因?yàn)g覽器兼容問題導(dǎo)致的事件觸發(fā)異常、API 調(diào)用報(bào)錯(cuò)等線上故障,提升應(yīng)用穩(wěn)定性。

總結(jié)

原生事件是瀏覽器自帶的 DOM 事件系統(tǒng),遵循原生標(biāo)準(zhǔn),需手動(dòng)處理綁定 / 解綁、瀏覽器兼容等問題,靈活性高但開發(fā)成本和維護(hù)成本較高;合成事件是 React 基于原生事件封裝的上層事件系統(tǒng),核心價(jià)值在于 “統(tǒng)一化、高效化、穩(wěn)定化”,通過屏蔽兼容差異、優(yōu)化性能機(jī)制,降低復(fù)雜應(yīng)用的事件處理成本,是 React 事件系統(tǒng)的核心組成部分。

到此這篇關(guān)于深入理解React合成事件的文章就介紹到這了,更多相關(guān)React合成事件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在React頁面重新加載時(shí)保留數(shù)據(jù)的實(shí)現(xiàn)方法總結(jié)

    在React頁面重新加載時(shí)保留數(shù)據(jù)的實(shí)現(xiàn)方法總結(jié)

    在React頁面重新加載時(shí)保留數(shù)據(jù),可以通過多種方法來實(shí)現(xiàn),常見的方法包括使用瀏覽器的本地存儲(chǔ)(Local Storage 或 Session Storage)、URL參數(shù)、以及服務(wù)器端存儲(chǔ)等,本文給大家總結(jié)了一些具體實(shí)現(xiàn)方法,需要的朋友可以參考下
    2024-06-06
  • react-redux及redux狀態(tài)管理工具使用詳解

    react-redux及redux狀態(tài)管理工具使用詳解

    Redux是為javascript應(yīng)用程序提供一個(gè)狀態(tài)管理工具集中的管理react中多個(gè)組件的狀態(tài)redux是專門作狀態(tài)管理的js庫(不是react插件庫可以用在其他js框架中例如vue,但是基本用在react中),這篇文章主要介紹了react-redux及redux狀態(tài)管理工具使用詳解,需要的朋友可以參考下
    2023-01-01
  • React中Redux Hooks的使用詳解

    React中Redux Hooks的使用詳解

    這篇文章主要介紹了React Redux Hooks的使用詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • React中條件渲染的常見方法總結(jié)

    React中條件渲染的常見方法總結(jié)

    條件渲染在React開發(fā)中非常重要的功能,它允許開發(fā)人員根據(jù)條件控制渲染的內(nèi)容,在創(chuàng)建動(dòng)態(tài)和交互式用戶界面方面發(fā)揮著至關(guān)重要的作用,本文總結(jié)了常用的的條件渲染方法,需要的朋友可以參考下
    2024-01-01
  • create-react-app 修改為多入口編譯的方法

    create-react-app 修改為多入口編譯的方法

    這篇文章主要介紹了create-react-app 修改為多入口編譯的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • React中使用setInterval函數(shù)的實(shí)例

    React中使用setInterval函數(shù)的實(shí)例

    這篇文章主要介紹了React中使用setInterval函數(shù)的實(shí)例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • React實(shí)現(xiàn)基于Antd密碼強(qiáng)度校驗(yàn)組件示例詳解

    React實(shí)現(xiàn)基于Antd密碼強(qiáng)度校驗(yàn)組件示例詳解

    這篇文章主要為大家介紹了React實(shí)現(xiàn)基于Antd密碼強(qiáng)度校驗(yàn)組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • React Hook 監(jiān)聽localStorage更新問題

    React Hook 監(jiān)聽localStorage更新問題

    這篇文章主要介紹了React Hook 監(jiān)聽localStorage更新問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • React生命周期函數(shù)圖解介紹

    React生命周期函數(shù)圖解介紹

    生命周期函數(shù)指在某一時(shí)刻組件會(huì)自動(dòng)調(diào)用并執(zhí)行的函數(shù)。React每個(gè)類組件都包含生命周期方法,以便于在運(yùn)行過程中特定的階段執(zhí)行這些方法
    2022-11-11
  • React?Hooks項(xiàng)目實(shí)戰(zhàn)

    React?Hooks項(xiàng)目實(shí)戰(zhàn)

    React?Hooks是React?16.8版本引入的新特性,它使得在函數(shù)組件中也能夠使用狀態(tài)(state)和其他React特性,本文就來詳細(xì)介紹一下React?Hooks項(xiàng)目實(shí)戰(zhàn),感興趣的可以了解一下
    2023-11-11

最新評(píng)論

宾阳县| 康保县| 乌审旗| 长海县| 阳东县| 潞西市| 婺源县| 万山特区| 库车县| 彭泽县| 腾冲县| 崇信县| 忻州市| 尤溪县| 塔河县| 青岛市| 德保县| 婺源县| 宜章县| 广水市| 柳河县| 太仆寺旗| 盖州市| 洛隆县| 革吉县| 大关县| 遂川县| 扶余县| 甘泉县| 杭州市| 行唐县| 乌苏市| 石家庄市| 叶城县| 绥芬河市| 绥棱县| 贺州市| 德化县| 大城县| 永昌县| 古交市|