react合成事件

react源码要封装合成事件优势

  • 通过事件委托机制,将所有事件处理程序附加到根元素上,而不是每个子元素;提高了性能和内存使用效率,特别是在有大量元素的情况下
  • 重新封装的合成事件消除了浏览器的差异,兼容性好

如何实现的

  • 事件注册: 在createRoot之前就会调用
scss 复制代码
// 当前React18提供了以下5个合成事件
Plugin SimpleEventPlugin.registerEvents(); // SimpleEventPlugin 处理一些常用的基础事件,详细请参见DOMEventProperties.js 中的registerSimpleEvents注册函数 
EnterLeaveEventPlugin.registerEvents(); // 鼠标移动事件 
ChangeEventPlugin.registerEvents(); // 修改事件 
SelectEventPlugin.registerEvents(); // 处理选择事件 
BeforeInputEventPlugin.registerEvents(); // 处理控件输入前事件
  • 事件绑定
scss 复制代码
const createRoot(rootContainerElement){
   .....
   // 在根元素上进行事件绑定
   listenToAllSupportedEvents(rootContainerElement);
}
  • 事件触发
scss 复制代码
 export function dispatchEvent(
  domEventName: DOMEventName,
  eventSystemFlags: EventSystemFlags,
  targetContainer: EventTarget,
  nativeEvent: AnyNativeEvent,
): void {
  ......
  // 收集沿途事件、构建合成事件、遍历捕获事件、遍历冒泡事件
  dispatchEventForPluginEventSystem(
    domEventName,
    eventSystemFlags,
    nativeEvent,
    null,
    targetContainer,
  );
}

function dispatchEventsForPlugins(
  domEventName: DOMEventName,
  eventSystemFlags: EventSystemFlags,
  nativeEvent: AnyNativeEvent,
  targetInst: null | Fiber,
  targetContainer: EventTarget,
): void {
  const nativeEventTarget = getEventTarget(nativeEvent);
  // 存放事件的队列
  const dispatchQueue: DispatchQueue = [];
  // 收集沿途事件、构建合成事件
  extractEvents(
    dispatchQueue,
    domEventName,
    targetInst,
    nativeEvent,
    nativeEventTarget,
    eventSystemFlags,
    targetContainer,
  );
  // 遍历捕获事件、遍历冒泡事件
  processDispatchQueue(dispatchQueue, eventSystemFlags);
}

大致流程图如下:

文章借鉴 juejin.cn/post/739947...

相关推荐
終不似少年遊*1 天前
【安全业务Agent】从场景到编排
python·react.js·ai·langchain·agent·安全架构·工作流
JavaPub-rodert2 天前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
Highcharts.js2 天前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格
JudithHuang2 天前
React 嵌套路由与布局
前端·react.js·arcgis·react·react router
前端小D2 天前
React Native项目开发(iOS侧为例)
javascript·react native·react.js
志尊宝3 天前
AI原生前端开发(042):AI辅助的路由设计与优化
javascript·react.js·ai-native
znsoft4 天前
MaClaw(码卡龙)技术拆解:一个 Go + React 的可自进化智能体平台
开发语言·react.js·golang
濮水大叔4 天前
React/Next.js 生态里,有没有 CabloyJS 这样的全栈框架?
react.js·全栈·next.js
前端小D4 天前
React Native Android 项目搭建
android·react native·react.js
Highcharts.js5 天前
Highcharts 集成到 React 或 Vue 项目中时,如何高效地使用 TypeScript技巧?
vue.js·人工智能·react.js·typescript·前端框架·highcharts