在 React 中,onKeyUp 和 onKeyUpCapture(以及 onKeyDown/Capture)有什么区别?

May*_*ron 11 html dom-events reactjs

我为此搜索了文档和问题,但很惊讶找不到一个。

在 React index.d.ts 文件中,它显示:

// Keyboard Events
onKeyDown?: KeyboardEventHandler<T>;
onKeyDownCapture?: KeyboardEventHandler<T>;
onKeyPress?: KeyboardEventHandler<T>;
onKeyPressCapture?: KeyboardEventHandler<T>;
onKeyUp?: KeyboardEventHandler<T>;
onKeyUpCapture?: KeyboardEventHandler<T>;
Run Code Online (Sandbox Code Playgroud)

我想使用 onKeyUp 但后来我注意到了两个版本。这和 onKeyUpCapture 有什么区别,一个比另一个有什么好处?我什么时候使用每个?

Mat*_*adi 29

react 中的事件处理程序传递 的实例SyntheticEvent,这是一个围绕浏览器本机事件的跨浏览器包装器。该术语capture与 React 无关。事实上,它是一个来自 DOM HTML Event 的概念。

事件传播DOM 事件的3 个一般阶段:

捕获阶段:通过从窗口到目标的父目标的祖先中的事件对象传播。(事件归结为元素)。您几乎不想在实际代码中使用它。

目标阶段:本次活动对象到达事件对象的事件的目标。此阶段也称为在目标阶段。如果事件类型表明事件没有冒泡,则事件对象将在此阶段完成后停止。

气泡相:通过以相反的顺序目标的祖先中的事件对象传播,开始与目标的父,并与窗口结束。这个阶段也称为冒泡阶段。

事件对象被分派到事件目标。但是在分派开始之前,必须首先确定事件对象的传播路径。

传播路径是事件经过的当前事件目标的有序列表。这个传播路径反映了文档的层次树结构。列表中的最后一项是事件目标,列表中的前一项称为目标的祖先,紧邻的前一项称为目标的父项。

下面是一个点击 <td> 的 DOM 事件流的例子

正如你在这张图片中看到的,它显示了从窗口开始,通过祖先链一直到元素目标的捕获阶段。然后当它到达目标元素时,它在那里触发 -目标阶段最后它冒泡到目标的祖先 -冒泡阶段(如果有任何祖先,将停止冒泡stopPropagation

所以 React 通过将它附加到onKeyUp哪个是为您提供捕获阶段onKeyUpCapture

3 个不同传播阶段的示例

  • 正确,正如我所解释的,“onKeyUpCapture”将首先从窗口通过元素的祖先触发。(取决于你想在哪里拥有它)。当它到达目标后,它会触发目标,最后它会从目标冒泡到它的父级。您几乎不需要在代码中使用“Capture”,除非您出于某种原因想要在某些内容到达实际目标元素之前对其进行处理,例如具有复杂的动画。 (5认同)
  • 这是我见过的对这三个阶段的最好解释。谢谢你。那么onKeyUpCapture什么时候被触发呢?我假设它在 onKeyUp 之前,因为根据我的理解,onKeyUp 在目标阶段被调用?onKeyUpCapture 是否在捕获目标后发生?如果它是这样工作的,那么如果它在 onKeyUp 之前立即被调用,那么使用它会有很多好处吗? (4认同)