React的事件系统和浏览器事件系统相比,主要增加了两个特性:事件代理、和事件自动绑定。

1、事件代理

区别于浏览器事件处理方式,React并未将事件处理函数与对应的DOM节点直接关联,而是在顶层使用
了一个全局事件监听器监听所有的事件;
React会在内部维护一个映射表记录事件与组件事件处理函数的对应关系;
当某个事件触发时,React根据这个内部映射表将事件分派给指定的事件处理函数;
当映射表中没有事件处理函数时,React不做任何操作;
当一个组件安装或者卸载时,相应的事件处理函数会自动被添加到事件监听器的内部映射表中或从表中删除。

2、事件自动绑定

在JavaScript中创建回调函数时,一般要将方法绑定到特定的实例,以保证this的正确性;

首先回顾以下原生事件的两个方法: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. js事件委托(事件代理)的原理以及优缺点

    js事件委托/事件代理的原理以及优缺点 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上 ...

  2. React组件-事件、状态和生命周期

    组件状态 事件 (事件名大写) 注意:组件事件需要配合状态,所以现在无法呈现效果 class Cmp1 extends React.Component{constructor(...args){sup ...

  3. 浏览器事件代理机制原理?

    关于浏览器事件代理 弄明白浏览器事件代理事前,先了解下事件.事件流. 一,事件 HTML DOM 允许 JavaScript 对 HTML 事件作出反应.即操作对应HTML元素时,会触发相应事件(包含 ...

  4. JS事件委托或者事件代理原理以及实现

    事件委托(事件代理)原理:简单的说就是将事件交由别人来执行,就是将子元素的事件通过冒泡的形式交由父元素来执行. 为什么要用时间委托? 在JavaScript中,添加到页面上的事件处理程序数量将直接关系 ...

  5. 探索React合成事件

    探索 React 合成事件 一.什么是合成事件 React 合成事件(SyntheticEvent)是 React 模拟原生 DOM 事件所有能力的一个事件对象,即浏览器原生事件的跨浏览器包装器.它根 ...

  6. “约见”面试官系列之常见面试题之第六十六篇之事件委托的原理和实现(建议收藏)

    事件委托(事件代理)原理:简单的说就是将事件交由别人来执行,就是将子元素的事件通过冒泡的形式交由父元素来执行. 为什么要用时间委托? 在JavaScript中,添加到页面上的事件处理程序数量将直接关系 ...

  7. 用例子解释事件模型和事件代理

    事件模型 事件传播模型 在说事件代理之前,先来说一下事件模型. 在浏览器开发的早期,面对事件触发模型的问题,所有的程序员都认为事件触发不应该是直接触发的,而应该在文档中有一个传播的过程,然而事件传播的 ...

  8. 【DOM系列】你真的理解事件委托(事件代理)吗?

    目录 1. 基本概念 1.1 原理 2. 事件冒泡和事件捕获 代码演示 3. addEventListener的第三个参数 4. 事件委托阶段案例 4.1 事件冒泡案例 4.2 事件捕获案例 5. 经 ...

  9. 3. React 组件中怎么做事件代理?它的原理是什么?

    3. React 组件中怎么做事件代理?它的原理是什么? React 基于 Virtual DOM 实现了一个 SyntheticEvent 层(合成事件层), 定义的事件处理器会接收到一个合成事件对 ...

最新文章

  1. Lint found fatal errors while assembling a release target.
  2. UA MATH563 概率论的数学基础 鞅论初步1 条件期望
  3. day3 and homework
  4. 网络编程与分层协议设计:基于linux平台实现,网络编程与分层协议设计:基于Linux平台实现...
  5. 'display','position'和'float'相互关系
  6. BZOJ 1070: [SCOI2007]修车
  7. Nginx笔记总结十一:Nginx重写规则指南
  8. 哈工大中文分词系统LTP(pyltp)学习笔记
  9. 【机器学习】逻辑回归(LogisticRegression)分类鸢尾花
  10. PS打不开webp格式图片的解决方法
  11. 《等一朵花开》读书感悟
  12. Aras Innovator: TOC category的视图
  13. IJCAI 2022 | 即插即用分类器模块:一行代码大幅提升零样本学习方法效果
  14. 关于DDS文件格式的说明
  15. 华为手机备忘录怎样设置每个月12号短信提醒要做的事
  16. 三农经济的空缺,农业理财平台还能回暖吗?
  17. 英语学习——梨花带雨
  18. window10安装cloc
  19. 一键GHOST 硬盘版/优盘版/光盘版/软盘版
  20. 数据挖掘工具SmartMining

热门文章

  1. 零基础入门学习C语言008讲:函数(4)
  2. JMeter实用教程【二】-BeanShell的使用
  3. Rxjava2入门教程三:Operators操作符
  4. c语言描述考试答案,c语言期末试题
  5. Swift3.0从入门到放弃(二)
  6. 设计原则之DRY 原则
  7. Docker 学习笔记 ing
  8. Docker 为什么一定要sudo
  9. 用JS获取移动设备信息
  10. 分析:谁能抗衡巨人和阿里巴巴(转)