React是怎么进行事件处理的

news2024/11/25 10:30:19

什么是事件?

事件是指一些可以通过脚本响应的页面动作。当用户按下鼠标或者提交一个表单等等时候,事件都会出现。事件处理是一段JavaScript代码,总是与页面中的特定部分以及一定的事件相关联。当与页面特定部分相关联的事件发生时,事件处理器就会被调用。

JavaScript常用事件

image.png

React的事件处理

React 元素的事件处理和 DOM 元素的很相似。但是React的两点最大的不同是

  1. React 事件的命名采用小驼峰式(camelCase),而不是纯小写。
  2. 使用 JSX 语法时你需要传入一个函数作为事件处理函数,而不是一个字符串。

阻止默认行为

注意: 在 React 中另一个不同点是你不能通过返回 false 的方式阻止默认行为。你必须显式的使用 preventDefault

代码示例:
原生写法:

<a href="#" onclick="console.log('The link was clicked.'); return false">
  Click me
</a>

我们返回了false后会阻止<a>标签的原始跳转功能。只执行我们的console.log

React写法:

    function ActionLink() {
      function handleClick(e) {    e.preventDefault();    console.log('The link was clicked.');  }
      return (
        <a href="#" onClick={handleClick}>      Click me
        </a>
      );

功能上是和上面的代码一样的。但是在这里,e 是一个合成事件。React 根据 W3C 规范来定义这些合成事件,所以你不需要担心跨浏览器的兼容性问题。

为DOM元添加监听器

React不需要使用 addEventListener 为已创建的 DOM 元素添加监听器。只需要在该元素初始渲染的时候添加监听器即可。

代码示例:

    定义一个Toggle组件,当我们点击按钮时会切换我们按钮中的值,一直在NOOFF中切换。
    class Toggle extends React.Component {
      constructor(props) {
        super(props);
        this.state = {isToggleOn: true};

        // 为了在回调中使用 `this`,这个绑定是必不可少的   
        this.handleClick = this.handleClick.bind(this);  
        }
            执行我们的切换事件,切换state值
      handleClick() {  
          this.setState(state => ({ 
          进行取反
          isToggleOn: !state.isToggleOn    
          })); 
          }
          
      render() {
        return (
          <button onClick={this.handleClick}>      
          {this.state.isToggleOn ? 'ON' : 'OFF'}
          </button>
        );
      }
    }

    ReactDOM.render(
      <Toggle />,
      document.getElementById('root')
    );

注意: 我们必须谨慎对待 JSX 回调函数中的 this,因为在 JavaScript 中,class 的方法默认不会绑定 this。如果你忘记绑定 this.handleClick 并把它传入了 onClick,当你调用这个函数的时候 this 的值为 undefined。因为this 本质上就是指向它的调用者,this 是在函数运行时才绑定,在JavaScript 中普通函数都是 window 调用的,所以指向 window但是我们的JSX 语法是不被 webpack 识别的,webpack 默认只能处理 .js 后缀名的文件,所以需要借助 Babel 这个 JavaScript 编译器,而 babel 开启了严格模式 ,开启了严格模式下无法再意外创建全局变量。所以this指向的是 undefined。

解决React组件this指向问题的两种方法

方法一、在构造函数中使用bing

    class index extends Component {
        constructor(){
            super()
            this.speak = this.speak.bind(this)
            /*解决类中的this问题:this.speak = this.speak.bind(this),构造器里面的this默认指向实例对象,
          实例对象通过原型链在类的原型上找着fnc函数,通过bind函数将其this指向改为实例对象,并返回一个新的函数
          再将这个新的函数给实例,并取名为fnc*/
        }
        speak(){
            console.log(this)//输出当前实例对象
        }
        render() {
            return (
                <div>
                    <button onClick={this.speak}>按钮</button>
                </div>
            )
        }
    }

为什么是bind呢?

众所周知call、apply、bind 都可以改变我们的this指向。那为什么是bind呢?

区别:

  • call 和 bind 可以直接接受多个参数 apply 则是将参数放进一个数组
  • call 和 apply 返回立即执行函数,bind 返回新的函数,bind()() 也是立即执行
  • call和apply都是临时改变一次this指向,并立即执行。而bind是返回一个永久改变this指向的函数。使用 bind 绑定 this 后,该函数里面的 this 不能变化了,不论是谁调用

方法二、将箭头函数赋值给类的属性

    class index extends Component { 
        speak = () =>{ 
            console.log(this)
     } 
         render() { 
             return ( 
                 <div> 
                 <button onClick={this.speak}>按钮</button> 
                 </div> 
               ) 
          }
     }//需要传参的话,可以使用函数柯里化的思想

为什么什么箭头函数没影响呢?

箭头函数:箭头函数并不会创建自己的执行上下文,所以箭头函数中的this都是外层的this,会向外作用域中,一层层查找this,直到有 this 的定义

注意:性能存在差异

使用箭头函数来解决性能会比较低,因为箭头函数不是方法,它们是匿名函数表达式,所以将它们添加到类中的唯一方法是赋值给属性。前面介绍ES6的类的时候可以看出来,ES 类以完全不同的方式处理方法和属性

方法被添加到类的原型中,而不是每个实例定义一次。

类属性语法是为相同的属性分配给每一个实例的语法糖,实际上会在 constructor里面这样实现:

    constructor(){
        super()
        this.speak = () => {console.log(this)}
    }

这意味着新实例被创建时,函数就会被重新定义,丢失了JS实例共享原型方法的优势。而方法一,只是在生成实例时多了一步 bind 操作,在效率与内存占用上都有极大的优势

向事件处理程序传递参数

在循环中,通常我们会为事件处理函数传递额外的参数。例如,若 id 是你要删除那一行的 ID,以下两种方式都可以向事件处理函数传递参数:

    <button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
    //推荐第二种
    <button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>

在这两种情况下,React 的事件对象 e 会被作为第二个参数传递。如果通过箭头函数的方式,事件对象必须显式的进行传递,而通过 bind 的方式,事件对象以及更多的参数将会被隐式的进行传递。

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

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

相关文章

Qt制作程序启动界面类QSplashScreen实例测试详解

目录 一、QSplashScreen的概述 二、QSplashScreen静态图片加载 1、主程序实现 2、mainwindow.h实现 3、mainwindows.cpp实现 三、QSplashScreen动态图片加载 1、主程序实现 2、mainwindow.h实现 3、mainwindows.cpp实现 一、QSplashScreen的概述 QSplashScreen&#x…

Talking-Heads Attention

paper&#xff1a;Talking-Heads Attention 在CaiT这篇文章中&#xff0c;作用采用了talking-heads attention&#xff0c;这里做一下解释。 在原始multi-head self-attention中&#xff0c;各个head的计算是独立进行的&#xff0c;多个head的输出最后concat到一起&#xff0…

idea插件开发之如何获取用户输入的变量名(类变量,局部变量等)

写在前面 比如我们要开发一个变量名称补全功能的插件&#xff0c;此时就需要在用户输入时获取当前的最新输入内容&#xff0c;本文就来看下如何来做。 1&#xff1a;开发 首先我们需要创建一个CompletionContributor的子类&#xff0c;还需要一个CompletionProvider的子类来…

【文档+源码+调试讲解】国风彩妆网站springboot

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

基于STM32的智能温室控制系统

目录 引言环境准备智能温室控制系统基础代码实现&#xff1a;实现智能温室控制系统 4.1 温湿度传感器数据采集4.2 光照传感器数据采集4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;智能温室管理与优化问题解决方案与优化收尾与总结 1. 引言 智能温室控制系…

百度文库AI产品“橙篇”:支持10万字长文生成,开启AI创作新篇章

6月19日&#xff0c;百度文库发布了一款创新产品「橙篇」&#xff0c;这一行业首创的产品集成了10万字长文生成及多模态编辑能力&#xff0c;成为首个实现「查阅创编」一站式AI自由创作平台的里程碑。 百度“橙篇”官网&#xff1a; 地址&#xff1a;橙篇AI - 用橙篇&#xf…

iOS政策解读之一丨App提交审核前注意事项必知

大家好&#xff0c;我是小编阿文。欢迎您关注我们&#xff0c;经常分享有关Android出海&#xff0c;iOS出海&#xff0c;App市场政策实时更新&#xff0c;互金市场投放策略&#xff0c;最新互金新闻资讯等文章&#xff0c;期待与您共航世界之海。 iOS企业出海所面临的主要挑战…

nodejs从基础到实战学习笔记-模块化、包

二、模块化 2.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 2.1.1 把代码进行模块化拆分的好处 提高了代码的复用性提高了代码的可维护性可以实现按需…

“神刊”CA再回巅峰!2024年JCR正式发布,共21848本期刊,附完整版EXCEL版下载!

2024 年 6 月 20 日&#xff0c;科睿唯安&#xff08;Clarivate Analytics&#xff09;发布了最新的《期刊引证报告》(Journal Citation Reports&#xff0c;JCR&#xff09;&#xff0c;以下简要介绍最新影响因子&#xff08;IF&#xff09;情况&#xff1a; 2023年完整版JCR…

华为手机数据恢复,2个技巧介绍,误删文件后的紧急处理

对于华为手机用户来说&#xff0c;有时候我们会因为误操作或意外情况导致手机数据丢失&#xff0c;这无疑是棘手的。但是别担心&#xff0c;本文将为您推荐一些华为手机数据恢复的实用技巧&#xff0c;帮助您在误删文件后迅速找回丢失的数据&#xff0c;最大程度地减少损失。让…

MS17-010(Eternal blue永恒之蓝)漏洞利用+修复方法

目录 一、漏洞简介 漏洞原理 影响版本 二、漏洞复现 三、复现过程 1、扫描局域网内的C段主机&#xff08;主机发现&#xff09; 扫描结果&#xff1a; 2.使用MSF的永恒之蓝漏洞模块 3.对主机进行扫描&#xff0c;查看其是否有永恒之蓝漏洞 4.准备攻击 四、漏洞利用 …

多目标跟踪 距离的可视化(有动图)

多目标跟踪 距离的可视化&#xff08;有动图&#xff09; flyfish 马氏距离的计算涉及到协方差矩阵的逆&#xff0c;而协方差矩阵的特征值和特征向量决定了数据分布的形状。椭圆的中心是数据的均值向量&#xff0c;椭圆的形状和方向由协方差矩阵的特征向量和特征值决定。椭圆…

中石化加油卡有什么用?

对于有车一族来说&#xff0c;有一张加油卡真的可以省下不少钱 但是像我们这种没车的人&#xff0c;即使得到加油卡也毫无用武之地 久而久之&#xff0c;难免会造成卡过期的情况出现 还好&#xff0c;前两天把我手上堆积了好久的加油卡在收卡云上卖出去了&#xff0c;99折真…

录的视频太大怎么压缩?这几款软件真的很不错!

在数字化时代&#xff0c;视频已成为我们日常生活和工作中不可或缺的一部分。无论是记录生活点滴&#xff0c;还是制作工作汇报&#xff0c;视频都以其直观、生动的特点赢得了我们的青睐。然而&#xff0c;随着视频质量的提升&#xff0c;视频文件的大小也在不断增加&#xff0…

「51媒体」活动会议,展览展会,直播曝光的一种方法

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 我们在做活动会议&#xff0c;或者参加展览展会&#xff0c;需要进行直播的时候&#xff0c;可以通过一键同步多个媒体平台的方法&#xff0c;来扩大曝光&#xff0c;比如一场直播我们可…

【Python/Pytorch 】-- K-means聚类算法

文章目录 文章目录 00 写在前面01 基于Python版本的K-means代码02 X-means方法03 最小二乘法简单理解04 贝叶斯信息准则 00 写在前面 时间演变聚类算法&#xff1a;将时间演变聚类算法用在去噪上&#xff0c;基本思想是&#xff0c;具有相似信号演化的体素具有相似的模型参数…

Redis-事务-基本操作-在执行阶段出错不会回滚

文章目录 1、Redis事务控制命令2、Redis事务错误处理3、Redis事务错误处理&#xff0c;在执行阶段出错不会回滚 1、Redis事务控制命令 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set a1 v1 QUEUED 127.0.0.1:6379(TX)>…

Steam怎么购买黄金树之影 购买了黄金树之影怎么下载DLC教程

《艾尔登法环》大型DLC“黄金树幽影”将于6月21日正式上线&#xff0c;为广大玩家带来全新的冒险与挑战。在“黄金树幽影”中&#xff0c;玩家将拥有专属的强化系统。通过收集探索幽影之地获得的“幽影树的碎片”和“灵灰的加护”&#xff0c;不仅可以大幅度提升玩家的攻击力与…

SD卡上的文件删除不了?试试这6种方法!

用户案例 “我需要往32GB的三星Micro SD卡里复制文件&#xff0c;在此之前需要在电脑上删除一些SD卡上的数据来释放空间。但当我尝试按‘Ctrl Delete’删除文件时&#xff0c;文件无法从SD卡上删除。当我尝试格式化SD卡时&#xff0c;Windows提示该磁盘已写保护。这是怎么回事…

数字样机:飞行器状态控制系统仿真

引言&#xff1a;数字样机起源于20世纪90年代&#xff0c;是一种用数字化模型代替实际物理样机进行仿真分析的技术。 传统的飞行器研发流程往往遵循一套特定的循环结构&#xff1a;在设计初期&#xff0c;工程人员需要对飞行器提供一个综合的设计思路&#xff08;初期蓝图&…