[React] 合成事件和原生事件触发的先后顺序如何?【热度: 1,445】

关键词:React合成事件、原生事件、事件执行先后顺序

在React中,合成事件和原生事件的触发顺序是先合成事件,然后是原生事件。

React使用了一种称为"合成事件"的机制来处理事件。当你在组件中使用事件属性(例如onClick)时,React会在底层创建合成事件,并将其附加到相应的DOM元素上。合成事件是React自己实现的一套事件系统,它通过事件委托和其他技术来提供更好的性能和一致的事件处理方式。

当触发一个合成事件时,React会首先执行事件的处理函数,然后会调用合成事件的stopPropagation()方法来阻止事件冒泡。如果处理函数调用了stopPropagation(),则合成事件会终止,不再触发原生事件。

如果合成事件没有被终止,并且对应的DOM元素上还有原生事件监听器,React会触发相应的原生事件。原生事件是由浏览器提供的,React并没有对其进行改变或拦截。

因此,合成事件和原生事件的触发顺序是先合成事件,然后是原生事件。这意味着在事件处理函数中,你可以放心地使用合成事件对象,而不需要担心原生事件的影响。

为何有一些文章是说, 原生事件先执行?

原生事件先执行的说法是因为在React早期的版本中,React使用事件委托的方式来处理事件。事件委托是指将事件处理函数绑定在父元素上,然后利用事件冒泡机制,通过父元素捕获并处理子元素的事件。这种方式会导致在事件冒泡阶段,父元素的事件处理函数会先于子元素的事件处理函数执行。

在这种情况下,如果一个组件有一个合成事件和一个原生事件绑定在同一个元素上,原生事件的处理函数会在合成事件的处理函数之前执行。这就造成了一些文章中提到的原生事件先执行的观察结果。

然而,从React v16开始,React改变了事件处理的方式,不再使用事件委托,而是直接将事件处理函数绑定在目标元素上。这样做的好处是提高了性能,并且保证了事件处理函数的执行顺序与绑定顺序一致。

因此,根据React的最新版本,合成事件会先于原生事件执行。如果你发现有一些旧的文章提到原生事件先执行,那可能是因为这些文章对React的早期版本进行了描述,不适用于目前的React版本。