react中的合成事件

文章类型:React

发布者:hp

发布时间:2023-05-20

react合成事件机制是一种优化技术,底层实现了一套事件系统,通过事件委托和事件池来管理和处理事件,用于处理浏览器原生事件的跨浏览器兼容性和性能问题

一:原因

1:更好的兼容性和跨平台,解决了不同浏览器之间事件处理的差异性,提供统一的接口

2:性能优化:原生的事件处理机制在大量绑定事件时可能导致性能问题,通过事件委托的方式,将事件处理器绑定到组件的根元素上,利用事件冒泡机制实现事件处理。这样可以减少事件处理器的创建和销毁,提升性能

3:内存管理:原生事件处理机制在触发事件时会创建一个事件对象,并在事件处理完成后销毁。频繁创建和销毁事件对象可能会导致内存管理的问题。通过事件池管理事件对象,重复利用已创建的事件对象,减少了内存占用和垃圾回收的压力

4:全局事件监听:在组件树的根节点上统一监听事件,而不需要为每个组件都单独绑定事件处理器。简化事件管理,提高代码的可维护性和可重用性

二:原理

1:事件委托:将事件监听器绑定到组件根元素或其父元素上,然后通过事件冒泡机制,将事件处理委托给正确的组件。

2:事件池:来重用事件对象。每次触发事件时,React 会从事件池中获取一个事件对象,并将相关的事件信息填充到该对象中。这样可以减少内存消耗和垃圾回收的压力。

3:合成事件处理器:用于处理各种浏览器原生事件。可以使用类似于原生 DOM 事件处理器的方式,定义和绑定事件处理函数。


三:代码

import React from 'react';

function MyComponent() {
  // 定义事件处理函数
  const handleClick = (event) => {
    console.log('Button clicked!');
  };

  return (
    <button onClick={handleClick}>Click me</button>
  );
}

export default MyComponent;

四:图示

五:版本区别

  1. React16事件绑定到document上
  2. React17事件绑定到root组件上,有利于多个react版本共存,例如微前端
  3. event不是原生的,是SyntheticEvent合成事件对象

六:总结

1:使用合成事件时,事件对象是合成事件对象(SyntheticEvent),而不是浏览器原生事件对象

2:合成事件对象提供了与原生事件对象类似的属性和方法,如果需要访问原生事件对象,可以使用合成事件对象的 nativeEvent 属性

3:可以直接在组件中定义事件处理函数,并将其绑定到相应的元素上,从而实现事件的处理和响应

4:可以在内部管理事件处理函数的绑定和解绑,以及事件对象的重用和回收。可以减少内存消耗和垃圾回收的压力,并提高事件处理的性能