第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制)

课程目标

  1. 深入理解和掌握事件的冒泡及捕获机制
  2. 理解react中的合成事件的本质
  3. 在react组件中合理的使用原生事件

知识点

  1. 在原生的dom模型上触发的事件会进行事件传递。而所谓的事件传递指的是当在A元素上触发某一事件的时候,B元素如果满足了和A元素一定的关系的话,那么B元素上也可能触发改事件(即使B元素未添加该事件);

  2. dom模型是怎样的呢?如何一组dom元素可以看成一个是一个家族的族谱,那么我们就可以把dom元素之间的关系描述成直系和旁系,如果事件要进行传递的话,dom元素之间必须先满足直系的关系。且是在直系关系中,真正触发的元素的上层的元素才有可能被传递。如下:

<div>
<h1>hello world</h1>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<div>foot</div>
</div>


假如我们用鼠标点击了 <ul><ul/>这个元素的话,那么哪些元素可能也会触发点击事件呢?那么我们可以这样分析:

- 该元素的直系是这样的  `div > ul > li(4个)`
- 直系中的上层元素是 `div` 那么只有div才有可能触发点击事件。

那么,如果点击了 <li>1</li>这个元素呢?

  1. 假如点击了 <li>1</li>这个元素的话,根据分析可以知道将要触发事件的元素是 uldiv,那么它俩谁先触发呢?这就要涉及到捕获和冒泡的问题了!

    • 首先,捕获和冒泡决定的是事件传递的顺序,
    • 所有元素的事件默认都是冒泡的,但是在添加事件的时候,可以改变这种特质比如使用 addEventListener这个方法。
    • 那么冒泡的事件是从内向外传递的,捕获是从外向内传递的。
    • 捕获的事件的优先级要大于冒泡的优先级

根据以上的总结,那么点击了<li>1</li>这个元素的话,哪些元素会触发事件,且顺序是怎样的? divul会触发事件,顺序是先ul然后是div

  1. 如果某个事件的事件对象阻止了事件传递(ev.stopPropagation()),那么后续的事件就不会再触发了。

  2. 所有元素的顶层元素是 document;

  3. react中的合成事件就是利用了事件传递的这种特性,所有的元素事件触发,肯定会传递到document身上,react中为了节省性能,我们写在虚拟dom中的事件,其实在编译的时候,都被挂载到了document这个元素上,只是react自己实现了一套事件系统,可以记录真正触发的元素是那个,以及其他相关的信息。

  4. 函数的this指向,应该记住如下几点:

    • 函数在调用的时候才能去判断this的指向
    • 函数在调用的时候,我们要判断函数当前是在什么环境下调用的,此时函数指向该环境,比如:
        function add(){
    console.log(this)
    } cosnt obj = {add: add} add() // this指向window
    obj.add() // this指向obj这个对象
     
    • 函数的this在函数调用如下方法的时候可以被改变: bind call apply
    • 以new的方式调用函数的时候,函数的this也会被改变 new 函数名()
  5. react中事件的this指向,我们希望this的指向尽可能的指向组件实例。如下:

class Test extends Component {
constructor() {
super(arguments);
this.handleClick2 = this.handleClick2.bind(this);
}
handleClick(){
console.log(this);
return 'hello world';
}
handleClick1 = () => {
console.log(this);
return '123';
}
handleClick2(){
console.log(this)
return '456';
}
render() {
<div>
<h1>{this.handleClick}</h1>
<button className="button" onClick={this.onReactClick}>点击</button>
<button className="button" onClick={() => this.onReactClick()}>点击</button>
<button className="button" onClick={this.handleClick1}>点击</button>
<button className="button" onClick={this.handleClick2}>点击</button>
</div>
}
}
 

理解上述this的指向以及原理即可,记住一点:当事件触发的时候,对应的事件监听器会触发,要认清楚谁才是事件监听器,而且事件监听器的this指向谁。

#授课思路

#案例和作业

react第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制)的更多相关文章

  1. 关于syslog日志功能详解 事件日志分析、EventLog Analyzer

    关于syslog日志功能详解 事件日志分析.EventLog Analyzer 一.日志管理 保障网络安全 Windows系统日志分析 Syslog日志分析 应用程序日志分析 Windows终端服务器 ...

  2. “全栈2019”Java第五十三章:向上转型和向下转型详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. 《手把手教你》系列技巧篇(五十)-java+ selenium自动化测试-字符串操作-上篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

  4. 《手把手教你》系列技巧篇(五十一)-java+ selenium自动化测试-字符串操作-下篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

  5. 第二十二课:js事件原理以及addEvent.js的详解

    再看这篇博客之前,希望你已经对js高级程序编程一书中的事件模块进行了详读,不然我只能呵呵了. document.createEventObject,在IE下创建事件对象event. elem.fire ...

  6. 第三天:JS事件详解-事件流

    学习来源: F:\新建文件夹 (2)\HTML5开发\HTML5开发\04.JavaScript基础\6.JavaScript事件详解 学习内容:  1)基础概念 2)举例说明: 代码如上,如果用事件 ...

  7. cocos2dx+lua注册事件函数详解 事件

    coocs2dx 版本 3.1.1 registerScriptTouchHandler             注册触屏事件 registerScriptTapHandler             ...

  8. 无需开发,IT事件接入钉钉的方法详解

    1.市场在拥抱钉钉 虎嗅8月30日发表了一篇文章<为什么有很多企业沉迷钉钉无法自拔>,有兴趣的可以去看看,下附文章链接. 文章不短,其中有一部分阐述了:钉钉抓住以人为核心的"智能 ...

  9. POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

    http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...

随机推荐

  1. rkhunter

    0 0 * * 0 /usr/local/bin/rkhunter -c --cronjob 定时工具

  2. 怎么用Folx自动标签功能自动分类文件

    Folx标签功能可以帮助职场人士提高文件分类的效率.通过使用自动标签功能,用户可以在文件下载时,自动为相关的文件进行标签分类.接下来,小编会以创建"软件"自动标签为例,为大家演示相 ...

  3. 关于CopyOnWriterArrayList的一些理解

    学了cowarraylist之后,有些不明白的地方, 1.我们为什么要用写时复制的策略呢?,这样每次不是都要复制吗,性能不是很低吗?直接在元素组上扩容不好吗?而且读的时候数据一致性也保证不了,如果只是 ...

  4. HarmonyOS Java UI之DependentLayout布局示例

    DependentLayout简介 DependentLayout意为相对位置布局,与DirectionalLayout相比较有更多的排布方式,每个组件可以指定相对于其他同级组件的位置,也可以指定相对 ...

  5. 使用ES替代whoosh全文检索

    目录 1.docker安装ES 1.拉取docker镜像 2.使用docker安装ES 3.在页面中测试 2.使用ES替代whoosh全文检索 2.1 在Django中修改搜索引擎为ES 2.2 命令 ...

  6. Sysbench对Mysql进行基准测试

    前言 1.基准测试(benchmarking)是性能测试的一种类型,强调的是对一类测试对象的某些性能指标进行定量的.可复现.可对比的测试. 进一步来理解,基准测试是在某个时候通过基准测试建立一个已知的 ...

  7. Java基础教程——Lambda表达式

    Lambda表达式 Java8引入Lambda表达式,可以使代码更简洁. 格式:参数,箭头,代码 (参数名)->{代码} Lambda表达式体现了"函数式编程思想"-- 面向 ...

  8. Java基础教程——打印流

    打印流 打印流可以把原本输出到控制台的信息输出到文件中.PrintStream是字节打印流(还有个对应的字符打印流是PrintWriter,这里不涉及) System类中有个变量: public fi ...

  9. Linux Tomcat安装篇(daemon运行,开机自启动)

    目录 前言 作为一个Java后端开发者,tomcat想必是最最最熟悉的一个开发组件了,tomcat环境的搭建部署都十分简单.安装部署只需要两步,第一步下载,第二步解压,这样一个基础的tomcat环境就 ...

  10. [从源码学设计]蚂蚁金服SOFARegistry之消息总线异步处理

    [从源码学设计]蚂蚁金服SOFARegistry之消息总线异步处理 目录 [从源码学设计]蚂蚁金服SOFARegistry之消息总线异步处理 0x00 摘要 0x01 为何分离 0x02 业务领域 2 ...