参考:https://github.com/youngwind/blog/issues/107

首先回顾以下原生事件的两个方法:event.stopImmediatePropagation 和 event.stopPropagation ,前者可以阻止同一dom上的后续事件的执行以及阻止冒泡,后者仅能阻止冒泡。

测试如下:

默认情况下点击内部的div,会依次显示inner click1、inner click2、root click,这是因为以下事件是绑定在了冒泡阶段

    <div id="root">
外部
<div id="inner">内部</div>
</div>
<script>
document.querySelector("#root").addEventListener('click',function(){
alert('root click')
});
document.querySelector("#inner").addEventListener('click',function(){
alert('inner click1')
});
document.querySelector("#inner").addEventListener('click',function(){
alert('inner click2')
});
</script>

阻止事件冒泡,这时仅仅显示inner click1、inner click2,而没有显示root click了

        document.querySelector("#inner").addEventListener('click',function(evt){
alert('inner click1')
evt.stopPropagation();
});

多次绑定事件,只执行一个,并且阻止冒泡,就只显示一个inner click1了。

        document.querySelector("#inner").addEventListener('click',function(evt){
alert('inner click1')
evt.stopImmediatePropagation();
});

对于react合成事件系统的理解:

  在react内通过onClick绑定的事件,实际上并没有把点击事件绑定到对应的元素上,而是统一放到了document上处理。点击一个元素,首先触发这个元素的原生绑定事件(这里不讨论捕获),接着事件冒泡,到了document上,先触发dispatch,即分发react的合成事件,这个触发过程也是和冒泡类似,从里向外的。dispatch结束后,触发document上剩余的原生事件,也就是说可以认为dispatch是document上的第一个原生绑定事件,这个事件内进行react合成事件的分发。

  原生绑定的回调事件中获取到的是原生事件。通过react在jsx内onClick绑定的回调事件中获取到的是合成事件。

针对以上过程:

  • 如何使所有绑定的react onClick无效? 在子元素上原生绑定一个事件,然后阻止这个事件冒泡即可。
  • 如何只执行子元素的onClick而不执行父元素的onClick?在子元素的onClick中阻止事件冒泡即可,注意这里获取到的是合成事件,调用的是合成事件的方法,也就是说不管是原生事件还是合成事件, stopPropagation 的用法是一致的。
  • 如何只执行onClick,而不触发document的原生事件呢?在onClick中,调用: e.nativeEvent.stopImmediatePropagation 。这里的效果相当于在document的第一个原生事件(react自动绑定上的dispatch)中调用了 stopImmediatePropagation 阻止了 document 剩余的原生事件。

react事件代理的更多相关文章

  1. React事件初探

    作者:朱灵子 React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript 库.创造 React 是为了解决一个问题:构建随着时间数据不断变化的大规模应用程序 ...

  2. react事件机制

    1. react的事件是合成事件((Synethic event),不是原生事件 <button onClick={this.handleClick}></button> &l ...

  3. JavaScript事件代理和委托(Delegation)

    JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...

  4. Atitit事件代理机制原理 基于css class的事件代理

    Atitit事件代理机制原理 基于css class的事件代理 1.1. 在javasript中delegate这个词经常出现,看字面的意思,代理.委托1 1.2. 事件代理1 1.3. 代理标准化规 ...

  5. js中的事件委托或是事件代理详解

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  6. js事件代理(委托)

    JavaScript事件代理(委托)一般用于以下情况: 1. 事件注册在祖先级元素上,代理其子级元素.可以减少事件注册数量,节约内存开销,提高性能. 2. 对js动态添加的子元素可自动绑定事件. 之前 ...

  7. JS 事件代理

    事件处理器:onclick.onmouseover.... 在传统的事件处理中,你需要为每一个元素添加或者是删除事件处理器.然而,事件处理器将有可能导致内存泄露或者是性能下降——你用得越多这种风险就越 ...

  8. jquery事件代理

    在jQuery中,事件代理是指:把事件绑定到父级元素,然后等待事件通过DOM冒泡到该元素时再执行. 在事件侦听过程中有两种触发事件的方式:事件捕获和事件冒泡.事件冒泡更快,效率更高. 事件捕获:事件在 ...

  9. 封装Js事件代理方法

    // 封装事件代理 function delegateEvent(element, tag, event, listener) { // 判断是否支持addEventlistener if(eleme ...

随机推荐

  1. 集合:set

    set 就是数学上的集合——每个元素最多只出现一次.和sort一样,自定义一个类型也可以构造set ,但是必须定义“小于”运算符. 例子: 输入一个文本,找出所有不同的单词(连续的字母序列),按字典从 ...

  2. 使用em和rem替代px

    rem是指根元素的字体大小,默认情况下html的字体大小为:16px=1rem.而em是相对单位,是基于它的祖先元素计算的. 如果我们不指定html和body的字体大小,要得到12px的rem需要这样 ...

  3. 发布好的SDE 如何注册,让数据库更新 实现arcgis 服务更新

    1, 打开 MXD 文件,前期已经发布的文件 右键  service peopertisers 右键  Service  Property 出现如下界面: “+”号 需要需要选择SDE库 不需要 选择 ...

  4. React 实践记录 04 Flux demo

    Introduction flux应用架构如下图所示,本文并不是讲述怎么立即做一个酷炫的应用,而是讲述如何依照这种框架,来进行代码的组织. 我们先把这个流程转述为文字:抛开与webAPI的交互不谈,以 ...

  5. BZOJ1485: [HNOI2009]有趣的数列(Catalan数,质因数分解求组合数)

    题意 挺简洁的. 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<…<a ...

  6. okhttp使用心得(https验证不通过)(一)

    之前项目使用的是okhttp3.4版本的,tls协议支持1.0 1.2 等等 后来换成okhttp3.8.1,发现握手失败 找了好多原因之后  发现吧tls加上1.0后,就可以握手成功了,但是tls1 ...

  7. Android项目中包名的修改

    通常修改包名时会造成R文件错误,并且有时带有原因不明的Manifest文件中多处文本混乱. 所以,将目前认为最为简洁方便的修改包名流程记录如下: 假设我们目前的包名为com.pepper.util,我 ...

  8. php类重载

    首先,因为PHP是弱类型语言,是不直接支持重载的,不过可以通过一些方法来实现重载. 先说一下重写 在子类继承父类方法后,自己重新定义父类的方法,包含函数名,形参(个数,顺序)完全相同,但权限修饰符可不 ...

  9. mysql Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nona

    1. 操作mysql的时候提示如下错误 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and cont ...

  10. Fedora CentOS Red Hat中让vim支持语法高亮设置

    Fedora / CentOS / Red Hat这三个系统里默认的vi是没有语法高亮显示的,白色的字体看起来很不舒服. 首先用命令行cat /etc/os-release查看当前linux系统的类型 ...