react取消捕获_React中阻止事件冒泡的问题详析

本文详细解析了React中阻止事件冒泡的问题。在React中,由于事件处理系统的存在,直接使用`event.stopPropagation()`可能无法阻止事件冒泡到document。React通过在document上监听事件并派发到组件树,因此需要通过监听window或使用`event.nativeEvent.stopImmediatePropagation()`来阻止冒泡,或者避免混用React和原生DOM事件。
摘要由CSDN通过智能技术生成

前言

最近在研究react、redux等,网上找了很久都没有完整的答案,索性自己整理下,这篇文章就来给大家介绍了关于React阻止事件冒泡的相关内容,下面话不多说了,来一起看看详细的介绍吧

在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行。

JS 中事件的监听与处理

事件捕获与冒泡

DOM 事件会先后经历 捕获 与 冒泡 两个阶段。捕获即事件沿着 DOM 树由上往下传递,到达触发事件的元素后,开始由下往上冒泡。

IE9 及之前的版本只支持冒泡|  A

-----------------|--|-----------------

| Parent         |  |                |

|   -------------|--|-----------     |

|   |Children    V  |          |     |

|   ----------------------------     |

|                                    |

--------------------------------------

事件处理器

默认情况下,事件处理器是在事件的冒泡阶段执行,无论是直接设置元素的 onclick 属性还是通过 EventTarget.addEventListener() 来绑定,后者在没有设置 useCapture 参数为 true 的情况下。

考察下面的示例:

CLICK ME

document.addEventListener("click", function(event) {

console.log("document clicked");

});

function btnClickHandler(event) {

console.log("btn clicked");

}

输出:

btn clicked

document clicked

阻止事件的冒泡

通过调用事件身上的 stopPropagation()可阻止事件冒泡,这样可实现只我们想要的元素处理该事件,而其他元素接收不到。

CLICK ME

document.addEventListener(

"click",

function(event) {

console.log("document clicked");

},

false

);

function btnClickHandler(event) {

event.stopPropagation();

console.log("btn clicked");

}

输出:

btn clicked

一个阻止冒泡的应用场景

常见的弹窗组件中,点击弹窗区域之外关闭弹窗的功能,可通过阻止事件冒泡来方便地实现,而不用这种方式的话,会引入复杂的判断当前点击坐标是否在弹窗之外的复杂逻辑。

document.addEventListener("click", () => {

// close dialog

});

dialogElement.addEventListener("click", event => {

event.stopPropagation();

});

但如果你尝试在 React 中实现上面的逻辑,一开始的尝试会让你怀疑人生。

React 下事件执行的问题

了解了 JS 中事件的基础,一切都没什么难的。在引入 React 后,,事情开始起变化。将上面阻止冒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值