React17事件委托的变更

为了实现渐进式升级,React17 对 React 的事件系统进行修改。

React v17 中,React 不会再将事件处理添加到 document 上,而是将事件处理添加到渲染 React 树的根 DOM 容器中:

const rootNode = document.getElementById('root');
ReactDOM.render(<App />, rootNode);

在 React 16 及之前版本中,React 会对大多数事件进行 document.addEventListener() 操作。React v17 开始会通过调用 rootNode.addEventListener() 来代替。

在 React 16 或更早版本中,React 会由于事件委托对大多数事件执行 document.addEventListener()。但是一旦你想要局部使用 React,那么 React 中的事件会影响全局,如下面这个例子,当把 React 和 jQuery 一起使用,那么当点击 input 的时候,document 上和 React 不相关的事件也会被触发,这符合 React 的预期,但是并不符合用户的预期。

查看问题:issues:https://github.com/facebook/react/issues/7094

代码如下:

var Search = React.createClass({
    handleClick: function(e) {
        e.stopPropagation();
    },
    render: function() {
        return <input onClick={this.handleClick} />
    }
});
document.addEventListener('click', function() {
    console.log('propagation')
}, false);

令人开心的是,这次的 React 17 就解决了这个问题~,这次 React 不再将事件添加在 document 上,而是添加到渲染 React 树的根 DOM 容器中:

const rootNode = document.getElementById('root');
ReactDOM.render(<App />, rootNode);

这种改变不仅方便了局部使用 React 的项目,还可以用于项目的逐步升级,如一部分使用 React 18,另一部分使用 React 19,事件是分开的,这样也就不会相互影响。当然这并不是鼓励大家在一个项目中使用多个 React 版本,而只是作为一种临时处理的过渡~

React事件委托是指在React中,通过将事件监听器添加到父组件上,从而实现对子组件的事件处理。React使用事件委托的方式来提高性能和代码复用。通过事件委托,可以在父组件上监听特定类型的事件,并在合适的时候将事件传递给对应的子组件进行处理。 在React中,事件委托的实现主要依靠React的事件系统和组件的虚拟DOM机制。React使用了一种称为合成事件(SyntheticEvent)的机制来处理事件。当父组件监听到一个特定类型的事件时,React会将这个事件转化为一个合成事件对象,并将这个对象传递给父组件的事件处理函数。然后父组件可以根据合成事件对象的信息,判断事件源是哪个子组件,并调用相应的子组件的事件处理函数进行处理。 引用和是关于React事件委托的源码文件。其中,ReactBrowserEventEmitter.js定义了React事件委托的核心逻辑,包括事件的注册、分发等功能。而引用的ReactDOMEventListener.js则负责将DOM事件转化为合成事件。 综上所述,React事件委托是通过将事件监听器添加到父组件上,利用React的事件系统和虚拟DOM机制,实现对子组件的事件处理和分发。这种机制可以提高性能和代码复用,并且方便管理事件逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [jquery 监听td点击事件_React 事件 | 1. React 中的事件委托](https://blog.csdn.net/weixin_39538789/article/details/110105355)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值