合成事件
React有自己一套独立的事件系统,就是合成事件,它模拟原生事件所有的功能。根据W3C规范来定义合成事件,兼容了所有的浏览器,拥有和浏览器原生事件相同的接口。
在react中,可以通过e.nativeEvent获取到DOM事件,比如:<div onClick={(e)=>{console.log(e.nativeEvent)}}>点击</div>
。
合成事件的目的是:
- 实现浏览器兼容,方便跨平台。react采取顶层事件机制,保证事件冒泡一致性,可以跨浏览器执行。把不同平台事件,模拟合成事件。
- 方便事件统一管理和事务机制。
DOM原生事件
事件流:页面中绑定了很多的事件,而页面接收事件的顺序就是事件流。
事件传播大致分为三个阶段:
- 事件捕获阶段
- 目标阶段
- 事件冒泡阶段
首先,当一个事件被触发的时候,顶层对象发出一个事件流,一直流向目标节点,直到事件真正发生的目标元素;到达目标元素后,就执行目标元素该事件对应的处理逻辑;
事件冒泡就是事件从目标元素开始,往顶层元素传播,途中遇到节点绑定的事件,就会触发一次。如果需要阻止事件冒泡的话,就使用e.stopPropagation()来阻止事件冒泡。
事件代理:把响应事件委托到一个元素上,当子元素触发事件的时候,事件就向上冒泡,父节点获取到事件后,再判断是否是对应节点的事件,然后进行处理。事件代理的优点在于它可以减少内存消耗和动态绑定事件。
原生事件和合成事件区别
- 事件命名方式不同,原生事件命名纯小写,react事件命名方式是小驼峰,比如onClick;
- 事件处理函数不一样,原生事件的处理函数为字符串,在react中,是传入一个函数作为事件处理函数;
- 阻止默认行为不一样,原生事件可以通过返回false来阻止事件的默认行为。在react中,需要使用preventDefault()方法来阻止事件的默认行为。
react合成事件,是以事件委托的方式绑定在组件最上层。并且在组件卸载阶段会自动销毁。
react的所有事件都是绑定在document上【react17之后,事件是绑定在root容器上】,当真实DOM元素上触发事件的时候,就会冒泡到document或者是root容器上。然后再来处理react事件;