React源码分析6 — React合成事件系统

React源码分析6—React合成事件系统本自于阿里云云栖社区摘要:React源码系列文章,请多支持:[React源码分析1—组件和对象的创建(createClass,createElement)](s://wwatatech.org/s/72905)[React源码分析2—React组件插入DOM流程](wwReact源码系列文章,请多支持:React源码分析1—组件和对象的创建(createClass,createElement)React源码分析2—React组件插入DOM流程React源码分析3—React生命周期详解React源码分析4—setState机制React源码分析5--组件通信,refs,key,ReactDOMReact源码分析6—React合成事件系统1React合成事件特点React自己实现了一套高效的事件注册,存储,分发和重用逻辑,在DOM事件体系基础上做了很大改进,减少了内存消耗,简化了事件逻辑,并最大化的解决了IE等浏览器的不兼容问题。与DOM事件体系相比,它有如下特点1.React组件上声明的事件最终绑定到了document这个DOM节点上,而不是React组件对应的DOM节点。故只有document这个节点上面才绑定了DOM原生事件,其他节点没有绑定事件。这样简化了DOM原生事件,减少了内存开销2.React以队列的方式,从触发事件的组件向父组件回溯,调用它们在JSX中声明的callback。也就是React自身实现了一套事件冒泡机制。我们没办法用event.stopPropagation()来停止事件传播,应该使用event.preventDefault()3.React有一套自己的合成事件SyntheticEvent,不同类型的事件会构造不同的SyntheticEvent4.React使用对象池来管理合成事件对象的创建和销毁,这样减少了垃圾的生成和新对象内存的分配,大大提高了性能那么这些特性是如何实现的呢,下面和大家一起一探究竟。2React事件系统先看Facebook给出的React事件系统框图浏览器事件(如用户点击了某个button)触发后,DOM将event传给ReactEventListener,它将事件分发到当前组件及以上的父组件。然后由ReactEventEmitter对每个组件进行事件的执行,先构造React合成事件,然后以queue的方式调用JSX中声明的callback进行事件回调。涉及到的主要类如下ReactEventListener:负责事件注册和事件分发。React将DOM事件全都注册到document这个节点上,这个我们在事件注册小节详细讲。事件分发主要调用dispatchEvent进行,从事件触发组件开始,向父元素遍历。我们在事件执行小节详细讲。ReactEventEmitter:负责每个组件上事件的执行。EventPluginHub:负责事件的存储,合成事件以对象池的方式实现创建和销毁,大大提高了性能。SimpleEventPlugin等plugin:根据不同的事件类型,构造不同的合成事件。如focus对应的React合成事件为SyntheticFocusEvent2事件注册JSX中声明一个React事件十分简单,比如render(){return(<divonClick={(event)=>{console.log(JSON.stringify(event))}}/>);}那么它是如何被注册到React事件系统中的呢?还是先得从组件创建和更新的入口方法mountComponent和updateComponent说起。在这两个方法中,都会调用到_updateDOMProperties方法,对JSX中声明的组件属性进行处理。源码如下_updateDOMProperties:function(lastProps,nextProps,transaction){...//前面代码太长,省略一部分elseif(registrationNameModules.hasOwnProperty(propKey)){//如果是props这个对象直接声明的属性,而不是从原型链中继承而来的,则处理它//nextProp表示要创建或者更新的属性,而lastProp则表示上一次的属性//对于mountComponent,lastProp为null。updateComponent二者都不为null。unmountComponent则nextProp为nullif(nextProp){//mountComponent和updateComponent中,enqueuePutListener注册事件enqueuePutListener(this,propKey,nextProp,transaction);}elseif(lastProp){//unmountComponent中,删除注册的listener,防止内存泄漏deleteListener(this,propKey);}}}下面我们来看enqueuePutListener,它负责注册JSX中声明的事件。源码如下//inst:ReactComponent对象//registrationName:React合成事件名,如onClick//listener:React事件回调方法,如onClick=callback中的callback//transaction:mountComponent或updateComponent所处的事务流中,React都是基于事务流的functione...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?