React 组件中实现事件代理
作者:&ACE&
React的事件系统和浏览器事件系统相比,主要增加了两个特性:事件代理、和事件自动绑定,本文主要介绍了React 组件中实现事件代理,具有一定的参考价值,感兴趣的可以了解一下
React 并不会把所有的处理函数直接绑定在真实的节点上。而是把所有的事件绑定到结构的最外层,使用一个统一的事件监听器,这个事件监听器上维持了一个映射来保存所有组件内部的事件监听和处理函数。
当组件挂载或卸载时,只是在这个统一的事件监听器上插入或删除一些对象。
当事件发生时,首先被这个统一的事件监听器处理,然后在映射里找到真正的事件处理函数并调用。
这样做的优点是解决了兼容性问题,并且简化了事件处理和回收机制(不需要手动的解绑事件,React 已经在内部处理了)。但是有些事件 React 并没有实现,比如 window 的 resize 事件。
在React@17.0.3版本中:
- 所有事件都是委托在id = root的DOM元素中(网上很多说是在document中,17版本不是了);
- 在应用中所有节点的事件监听其实都是在id = root的DOM元素中触发;
- React自身实现了一套事件冒泡捕获机制;
- React实现了合成事件SyntheticEvent;
- React在17版本不再使用事件池了(网上很多说使用了对象池来管理合成事件对象的创建销毁,那是16版本及之前);
- 事件一旦在id = root的DOM元素中委托,其实是一直在触发的,只是没有绑定对应的回调函数;
在 React 组件中使用事件代理可以使用以下方法:
- 使用
on
方法来绑定事件监听器:
class MyComponent extends React.Component { handleClick(event) { if (event.target.tagName === 'BUTTON') { console.log('Button clicked'); } } render() { return ( <div onClick={this.handleClick}> <button>Click me</button> </div> ); } }
在上述例子中,handleClick
方法被绑定到父级 div
元素的 onClick
事件上。当点击 button
元素时,事件会冒泡到父级 div
元素,从而触发 handleClick
方法。然后可以通过 event.target
来判断点击的元素是否是 button
元素。
- 使用条件渲染来为不同的元素绑定不同的事件:
class MyComponent extends React.Component { handleClick(buttonType) { console.log(`${buttonType} clicked`); } render() { return ( <div> <button onClick={() => this.handleClick('Button 1')}>Button 1</button> <button onClick={() => this.handleClick('Button 2')}>Button 2</button> </div> ); } }
在上述例子中,通过使用箭头函数,在每个 button
元素的 onClick
属性中调用不同的 handleClick
方法,并传递不同的参数。
这些方法都是使用了 React 的事件委托机制,利用事件冒泡原理来实现事件代理。这样可以减少事件监听器的数量,并且提高性能。
到此这篇关于React 组件中实现事件代理的文章就介绍到这了,更多相关React 事件代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!