五、事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制

news2025/7/8 14:40:12

目标

  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指向谁。

授课思路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

freeswitch如何判断挂机方

概述 freeswitch作为VOIP的软交换平台&#xff0c;需要对呼叫的信息做判断和归类。 常见的呼叫信息中&#xff0c;挂机方向的信息对于话单统计有很大的用处。 但是fs的原始话单和日志中并没有挂机方向的信息。 环境 centos&#xff1a;CentOS7 freeswitch&#xff1a;v1.…

火遍国内外IT技术圈,豆瓣 9.7!这本技术书籍直接封神了

这是一本在国内外都被称为技术书籍巅峰之作的神书&#xff01; 国内的豆瓣评分 9.7&#xff08;满分 10.00&#xff09;&#xff0c;接近 90% 的人为这本书打了五星好评。 国外的 Goodreads&#xff08;类似于豆瓣&#xff09; 评分 4.72&#xff08;满分 5.00&#xff09; &a…

元宇宙:下一代互联网的“美丽新世界”

8月6日到8日,美国超人气歌手Ariana Grande在全球不同地区,连续举办了5场演唱会。与众不同的是,演出的举办地点在游戏《堡垒之夜》(Fortnite)中。全球上千万的玩家,使用自己的游戏角色盛装出席。演出中,一系列的小游戏贯穿了主线,最后粉丝在绚丽的场景中和“Ariana”一对…

42、Spring AMQP DirectExchange

1、DirectExchange 2、案例 3、通过配置类实现 1、配置类 2、Publisher 3、Consumer 4、测试结果 4、通过注解实现 1、Consumer添加Linstener 2、Publisher 执行测试方法 3、测试结果 4、总结分析 学习了DirectExchange之后&#xff0c;发现与FanoutExchange有些许差异&#…

腾讯程序员的手码K8S+Jenkins笔记

最近在GitHub上认识一个腾讯大佬&#xff0c;从他手上得到一份K8SJenkins笔记&#xff0c;好东西还是要共享的&#xff01;希望这份笔记能让你技术更上一层&#xff01; 从理论到实战深入K8S 学习K8S的学习笔记很少有比较齐全的&#xff0c;而这份K8S学习笔记&#xff0c;尽量…

谈了这么久的无代码到底是什么?

尽管我们一直在谈论关于“无代码”的方方面面&#xff0c;但却并没有专门谈及“无代码”是什么。不仅许多刚听到这个名词的人会感到疑惑&#xff0c;就算熟悉这一名词的可能也无法给出一个准确的定义&#xff0c;又或者常常将其与另一个相近的名词“低代码”弄混。 今天我们专…

Revit插件实现【快速扣减】的两种操作

翻模的过程中&#xff0c;我们在处理细节问题的时候&#xff0c;如果只是两个构件之间的重合&#xff0c;我们可以利用“连接”命令进行扣减。而如果是想让多个构件进行扣减操作&#xff0c;而不是整层或者整栋楼都按照同样的扣减顺序进行的话&#xff0c;我们可以利用橄榄山和…

Windows安全日志分析

Windows安全日志分析 0x00 引言 在应急响应初步阶段&#xff0c;我们会对系统日志、中间件安全日志、恶意文件等进行收集。接下来便是要进一步对这些文件进行分析&#xff1a;对恶意文件逆向、日志文件分析、梳理入侵时间线和入侵路径等。本文主要对Windows安全日志进行举例分…

Mybatis整合达梦数据库

陈老老老板&#x1f9b8;&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;国产数据库-达梦数据库&#xff08;主要讲一些达梦数据库相关的内容&#xff09;&#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下SpringBoot整合Mybatis与达梦数据库&#xff0c;就是简单…

全网最详细|Oracle12C安装和卸载图文教程

一. 数据库的引入 以前将数据用变量、数组、对象存在内存&#xff0c;而内存只能短暂存储数据。如果我们想长久存数据用文件将数据存在磁盘上&#xff0c;不方便存取和管理数据&#xff0c;因此可以使用数据库来存数据。 二. 数据库基础概念 2.1数据库(database,简称DB) 以…

QRegExpValidator(正则验证器)

QRegExpValidator QRegExpValidator 使用正则表达式 &#xff08;regexp&#xff09; 来确定输入字符串是可接受、中间还是无效的。正则表达式可以在构建 QRegExpValidator 时提供&#xff0c;也可以在以后提供。 构造函数&#xff1a; ​ 常用的函数&#xff1a; setRegE…

在Windows上使用Docker搭建ChirpStack私有LoRa服务端

在Windows上使用Docker容器部署ChirpStack服务&#xff0c;首先若要在Windows 10或11 上运行容器&#xff0c;需要以下条件&#xff1a; 一个运行 Windows 10 或 11 专业版或企业版的物理计算机系统。Hyper-V 功能已启用。 Windows下的Docker安装 1.Docker为Windows提供了一款…

如何设计一个支撑数亿用户的系统

要设计出一套能支撑几十亿人的系统是很困难的。对于软件架构师来说&#xff0c;这一直是一项很大的挑战&#xff0c;但是&#xff0c;从现在开始&#xff0c;看完我的文章&#xff0c;你就会觉得容易很多了。 下面是我在本文中提到的几个话题&#xff1a; 从最简单的开始&…

关于大数据测试,你一定要试试python的fake库

一.背景 对于大数据相关项目的测试&#xff0c;往往需要大量的测试数据&#xff0c;而场内测试时很难获取那么大批量的真实数据&#xff0c;这个时候需要测试人员能够快速模拟出符合要求的测试数据。这个时候要是有一个自动化工具或测试脚本简直不要太爽~ 二.问题引入 对于互…

【Ajax进阶】跨域和JSONP的学习

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录了解同源策略和跨域  同源策略    什么是同源    什么是同源策略跨域    什么是…

python基础07——函数,想重复使用自己的代码就写个函数吧

目录1 函数定义与调用1.1 自定义模块函数1.2 函数的返回值 return2 参数的传递方式2.1 位置参数2.2 默认值参数2.3 关键参数2.4 可变长度参数(收集和分配参数)2.4.1 收集位置参数2.4.2 分配位置参数,函数参数的序列解包2.4.3 收集关键字参数2.4.4 分配关键字参数3 变量的作用域…

腾讯云GPU云服务器在选择实例配置时应该注意哪些事项?

腾讯云异构计算服务器搭载GPU、FPGA等异构硬件&#xff0c;具有实时高速的并行计算和浮点计算能力&#xff0c;适合于深度学习、科学计算、视频编解码和图形工作站等高性能应用&#xff0c;下面分享腾讯云NVIDIA GPU云服务器配置CPU内存性能注意事项&#xff1a; NVIDIA GPU云…

26、Stream流式计算,链式编程

Stream流式计算&#xff0c;链式编程 什么是stream流式计算&#xff1f; 大数据包括&#xff08;存储计算&#xff09; 集合&#xff0c;mysql这些是用来存储的&#xff0c;而计算是用stream流式的 题目案例&#xff1a;只用一行代码&#xff0c;完成计算这些操作 操作&…

软件工程师备考1-2章(续)

一:差错控制 (1)奇偶检验 什么意思呢? 如果我们用 奇校验,就是保证传输过来的数据中的1是奇数,如果不是奇数那么说明传输错误。 (所以会增加一位,保证正确的数据的总的1一定是奇数) (2)海明码 什么是海明距离? 两个码字,例如 0 1 0 0 和 0 0 1 0 可以看到这…

java的Excel导出方式总结

一、使用hutool导出excel 1.1 hutool介绍 hutool功能很强大&#xff0c;http请求到json处理、excel的导入导出、定时任务、IO、缓存、数据库操作等都提供了简单而方便的api供我们使用&#xff0c;好处是再也不用担心自己去整理常用的工具类了&#xff0c;同时也支持按需引入【但…