浅谈React Event实现原理
React 元素的事件处理和 DOM元素的很相似。但是有一点语法上的不同:
并且 React 自己内部实现了一个合成事件,使用 React 的时候通常你不需要使用 addEventListener 为一个已创建的 DOM 元素添加监听器。你仅仅需要在这个元素初始渲染的时候提供一个监听器。 我们看一下这是怎么实现的 React 事件机制分为 事件注册,和事件分发,两个部分 事件注册
上述代码中, onClick 作为一个 props 传入了一个 handleClick,在组件更新和挂载的时候,会对props处理, 事件绑定流程如下: 核心代码: 在 ReactDOMComponent.js 进行组件加载 (mountComponent)、更新 (updateComponent) 的时候,调用? ReactDOMComponent.js
看下绑定方法 ReactBrowserEventEmitter.js listento
走到最后其实就是 doc.addEventLister(event,callback,false); 可以看出所有事件绑定在document上 所以事件触发的都是ReactEventListener的dispatchEvent方法 回调事件储存 listenerBank react 维护了一个 listenerBank 的变量保存了所有的绑定事件的回调。 回到之前注册事件的方法
当绑定完成以后会执行putListener。
EventPluginHub在每个React中只实例化一次。也就是说,项目组所有事件的回调都会储存在唯一的listenerBank中。 事件触发 注册事件流程图所示,所有的事件都是绑定在Document上。回调统一是ReactEventListener的dispatch方法。 我们先看一下事件触发的流程图:
我们看一下核心方法 _handleTopLevel ReactEventEmitterMixin.js
合成事件如何生成,请看上方事件触发的流程图 runEventQueuelnBatch(events)做了两件事
执行的细节如下: EventPluginHub.js
由上面的函数可知,dispatch 合成事件分为两个步骤:
其实在 EventPluginHub.js 里主要做了两件事情. 1.从event._dispatchListener 取出 dispatchlistener,然后dispatch事件, 上面这个函数最重要的功能就是将事件对应的dom元素绑定到了currentTarget上, 这样我们通过e.currentTarget就可以找到绑定事件的原生dom元素。 下面就是整个执行过程的尾声了: ReactErrorUtils.js
由invokeGuardedCallback可知,最后react调用了faked元素的dispatchEvent方法来触发事件,并且触发完毕之后立即移除监听事件。 总的来说,整个click事件被分发的过程就是: 1、用EventPluginHub生成合成事件,这里注意同一事件类型只会生成一个合成事件,里面的_dispatchListeners里储存了同一事件类型的所有回调函数 2、按顺序去执行它 ? 百度JS加密算法分析和修改超详细教程? ?下载地址:百度网盘下载 算法和数据结构? ?下载地址:百度网盘下载 数据结构与算法分析? ?下载地址:百度网盘下载 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |