只关注括号内问题的同学,可直接跳转到蓝字部分。(标题起的有点大,其实只讨论一个问题)

两个在React组件上绑定的事件,产生冲突后,使用e.stopPropagation(),阻止冒泡,即可防止事件冲突,毫无问题。

今天是踩了个React事件的坑,需求可以简化为:点击框体以外的部分则隐藏框体。最直接的想法,document上绑定个事件,设置控制显示隐藏的state为false,在框体上绑定个事件,阻止冒泡。这样点击框体内部就不会触发document上的事件。

等写完了,发现一个问题,无法阻止冒泡,一搜索,好家伙,好多人问e.stopPropagation()为什么无法阻止事件冒泡,但是鲜有靠谱的回答。我第一个想法是原生事件和React事件产生冲突。明显绑定原生事件是不符合React精神的,但我决定在探索真理的路上走下去了。

为了直观的调试,把需求转化为,点击框体内 alert(1)点击框体外 alert(2)。

在document上绑定 alert(2),框体上(框体为React组件,下同)绑定 alert(1),不做特殊处理,点击框体内,根据事件冒泡,先弹 1 再弹 2 。这一点符合预期。此时e.stopPropagation()无法阻止冒泡。

经过 Stack Overflow 解惑 e.nativeEvent.stopImmediatePropagation() 可以完美实现预期。

下面进入探索环节,经查阅资料,得出以下结论:

  1. React为了提高效率,把事件都委托给了document,所以 e.stopPropagation() 并非是不能阻止冒泡,而是等他阻止冒泡的时侯,事件已经传递给document了,没东西可阻止了。可以通过在document.body上绑定 alert(3),直观的了解这一点,3 是优先于 1 弹出的。
  2. e.stopPropagation()不行,浏览器支持一个好东西,e.stopImmediatePropagation() 他不光阻止冒泡,还能阻止在当前事件触发元素上,触发其它事件。这样即使你都绑定到document上也阻止不了我了吧。
  3. 这样做还不行,React对原生事件封装,提供了很多好东西,但也省略了某些特性。e.stopImmediatePropagation() 就是被省略的部分,然而,他给了开口:e.nativeEvent ,从原生的事件对象里找到stopImmediatePropagation(),完活。

测试代码如下:

class Test extends React.Component{componentDidMount(){document.οnclick=this.two;}one(e){e.nativeEvent.stopImmediatePropagation();alert(1)}two(){alert(2)}render(){return(<div style={{height:150,width:150,backgroundColor:"#000"}} onClick={this.one}/>)}
}ReactDOM.render(<Test/>,document.getElementById("test")
);

感谢且不仅限于:

转载于:https://www.cnblogs.com/libin-1/p/6298326.html

深入React事件系统(React点击空白部分隐藏弹出层;React阻止事件冒泡失效)相关推荐

  1. jquery/js 点击空白区域隐藏某一个层/元素

    场景:点击一个按钮弹出一个对话框/气泡,点击空白区域隐藏对话框/气泡: html: <button id="btn">按钮</button> <div ...

  2. bootstrap弹出框如何实现点击出弹出框后,再点击任意地方隐藏弹出框

    最近做个项目是用bootstrap搭建的网站,因为其自带弹出框很好使,便直接拿过来用了. 不废话直接进入正题 共分两步 1. 首先设弹出框方式为自动 popover(function(){trigge ...

  3. jQuery 怎么实现点击页面其他地方隐藏菜单? 做了个按钮点击时弹出菜单,想实现点击其他地方时隐藏弹出的菜单

    <p><a href="javascript:void(0)" class="a">菜单按钮</a></p> & ...

  4. jquery实现div的隐藏和显示和点击空白显示隐藏

    $('#button')是要点击的按钮,$('#view')是要显示或隐藏的内容区域 一.点击按钮显示隐藏 $(function () { $("#button").click(f ...

  5. 处理 react_【学习教程】React 中阻止事件冒泡的问题

    来源 | https://www.cnblogs.com/Wayou/p/react_event_issue.html 在正式开始前,先来看看 js 中事件的触发与事件处理器的执行. js 中事件的监 ...

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

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

  7. JS、Vue、React阻止事件冒泡及阻止默认事件

    JS阻止事件冒泡及阻止默认事件解决方案: 1.event.preventDefault -- 阻止默认 Event 接口的 preventDefault()方法,告诉user agent:如果此事件没 ...

  8. React 在body上绑定事件以及阻止事件冒泡

    <!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>R ...

  9. 利用React/anu编写一个弹出层

    本文将一步步介绍如何使用React或anu创建 一个弹出层. React时代,代码都是要经过编译的,我们很多时间都耗在babel与webpack上.因此本文也介绍如何玩webpack与babel. 我 ...

最新文章

  1. JavaScript Document
  2. 《Arduino实战》——第1章 你好Arduino
  3. 网络之NSURLSession
  4. RabbitMQ入门-Routing直连模式
  5. Ubuntu init启动流程分析浅析
  6. linux-basic(11)认识和学习bash
  7. Eigen(5)Array类和元素级操作
  8. asp.net如何生成图片验证码
  9. Sping--AOP--XML
  10. java中check和uncheck异常处理
  11. 程炳皓:我不恨陈一舟 开心网做不好是我自己的问题
  12. AWB(Auto White Banlance)——自动白平衡
  13. Artefact China 获得CCPS网络安全等保三级证书
  14. 战地4高性能服务器,战地4服务器推荐配置
  15. html设置%3ca%3e的图标,HTML中content表示的特殊字符和图标
  16. python正则表达式入门_python入门_常见正则表达式匹配
  17. 我们不生产代码,我们是代码的搬运工
  18. ZYNQ7020系列——PLL学习
  19. 如何将本地的项目推送至git仓库
  20. 肠道微生物群影响眼部健康

热门文章

  1. cassandra本地连接失败_无法连接到本地Cassandra实例?
  2. html输入框只能输入几个,input 两个input框只能允许同时输入一个
  3. SPI接口通信协议详解:SPI时序、2线、3线、4线SPI及4种常用工作模式
  4. centos文件服务器软件,seafile服务器端的centos8的快速部署
  5. python 列表解析式_python列表解析式,字典解析式,集合解析式和生成器
  6. oss客户端工具_干货 | 基于Go SDK操作京东云对象存储OSS的入门指南
  7. stm32温度控制按键_干货 | STM32常用功能介绍
  8. apache2 wordpress目录权限_WSL(ubuntu)的Apache2+CGI(包含CGICC)+SSL的配置
  9. 呵,你会51单片机的精确延时吗?
  10. 学妹靠这个学会硬件开发入职华为,今天搞到100个免费名额!