React 中事件处理
不要问自己需要什么样的人生,而要问自己想要成为什么样的人。
我们从前面的学习知道一个 React 组件不仅仅只包含 DOM 结构的,还应该样式和 Javascript 逻辑的。这里我们认识逻辑构造之事件处理。
1. React 事件处理
这里列举了在 React 中事件的几种绑定处理方式:
import React, { Component } from "react";
class App extends Component {
render () {
return (
<div>
<input/>
<button onClick={ ()=>{ console.log("第一种事件绑定处理方式") }}>Add-1</button>
<button onClick={ this.handleClick2 }>Add-2</button>
<button onClick={ this.handleClick3 }>Add-3</button>
<button onClick={ ()=>{ this.handleClick4() } }>Add-4</button>
</div>
)
}
handleClick2() {
console.log("第二种事件绑定处理方式")
}
handleClick3 = ()=>{
console.log("第三种事件绑定处理方式")
}
handleClick4 = ()=>{
console.log("第四种事件绑定处理方式")
}
}
export default App;
2. 事件绑定区别
这里重点说明下在事件和事件绑定绑定中 this 指向问题。
2.1 匿名函数
直接执行匿名函数,直接在 {} 中写事件函数表达式。
写法特点:
- 适合逻辑少、简单表达式。如果处理逻辑过多、复杂 ,会导致结构不清晰,难维护,不推荐。
- 事件内部 this 指向和外部一致,因为箭头函数没有 this 指向问题原则。
能直接访问:
- 因为 onClick 后面表达式跟的是一个函数(箭头函数),这里事件内部 this 指向和外部一致。
class App extends Component {
// 定义属性
value = 100
render () {
return (
<div>
<input/>
<button onClick={ ()=>{ console.log("第一种事件绑定处理方式", this.value) }}>Add-1</button>
</div>
)
}
2.2 调用内部普通函数
写法特点:this 指向和外部不一致,需要用 bind 修正 this 指向,不推荐使用。
<button onClick={ this.handleClick2 }>Add-2</button>
// 修正后:
<button onClick={ this.handleClick2.bind(this) }>Add-2</button>
handleClick2() {
// 异常,需要通过改变 this 指向解决
console.log("第二种事件绑定处理方式", this.value)
}
不能直接访问:
这里访问类属性 this.value 会报错,我们可以打印出 this 看下它指向什么,结果会是:undefined。为什么 this 会丢失呢?记住一句话:函数中的 this 谁调用我,this 就指向谁。这里点完按钮后被 React 事件系统调用的,this 指向的应该是 React 事件系统。用于不会指向 App 这个实例。而这里它也没有指向 React 事件系统,而是丢了指向 undefined。哈哈哈....
2.3 调用内部箭头函数
写法特点:this 指向和外部一直,没有 this 指向问题,推荐使用。
<button onClick={ this.handleClick3 }>Add-3</button>
handleClick3 = ()=>{
console.log("第三种事件绑定处理方式", this.value)
}
这里是箭头函数,this 指向根本不关心谁调用的我,它永远保持与外部作用域一样的,它指向的 app 的实例。为什么箭头函数 this 指向就不关心谁调用的我呢?我也不知道.... 难到....
- 箭头函数会自动改变 this 的指向???
- 或者箭头函数不是改变 this 指向,而是引用上一个作用域的 this ???
- 一个比较权威的解释是在箭头函数中,this 与封闭词法上下文的 this 保持一致。在全局代码中,它将被设置为全局对象。
2.4 执行匿名函数,调用其他内部函数
写法特点:this 指向和外部一直,没有 this 指向问题,符合谁调用我我指向谁。非常推荐使用这种写法,参数传递很方便。
<button onClick={ ()=>{ this.handleClick4() } }>Add-4</button>
// 语法简写:
<button onClick={ ()=>this.handleClick4() }>Add-4</button>
// 有人说这里是因为你写成了箭头函数了吧,即使他不写成箭头函数也没关系,刚才讲的原理,符合谁调用我我指向谁。
handleClick4 = ()=>{
console.log("第四种事件绑定处理方式", this.value)
}
整体有个问题: 要不要加小括号,不加不让他自己主动执行,点击系统会调用、加小括号执行函数。加小阔号主动执行,点击后不执行 undefined。
2.5 JS 中修正 this 指向方案
- call:改变 this 指向,自动执行函数;
- apply:改变 this 指向,自动执行函数;
- bind:改变 this 指向,不会自动执行函数,需要手动加括号执行函数 ;
var obj1 = {
name: "obj1",
getName() {
console.log(this.name)
}
}
var obj2 = {
name: "obj2",
getName() {
console.log(this.name)
}
}
// this.name 谁调用我我指向谁
obj1.getName() // 结果 obj1
obj2.getName() // 结果 obj2
// call, reply :修改 obj1 getName 中 this 指向 obj2
obj1.getName.call(obj2) // 结果 obj2
obj2.getName() // 结果 obj2
3. 总结事件处理
3.1 this 指向问题,记住两句话
- 谁调用我我指向谁原则;
- 箭头函数没有 this 指向问题;
3.2 React 事件绑定和原生事件绑定有什么区别?
React 中事件绑定没有绑定到具体的 DOM 节点(元素)身上。它采用的是一种事件代理的模式,绑定在根节点身上。绑定到每一个 DOM 节点身上是很消耗内存的。
React 模拟了一套事件冒泡机制,等冒泡到根节点上通过 target 事件源找到是那个元素真实触发的,然后从这个触发的元素到顶点所有节点都去查一查,有没有一个叫 onClick 属性,如果有就把这个 onClick 事件给执行了,完整模拟冒泡的流程,即模拟系统事件机制。其不需要考虑解绑、移除事件等,只有节点从页面中没了,onClick 根本就不会再有了,没有绑定只有节点没了 onClick 就没了。

3.3 Event 事件对象也是支持的
Event 对象,和普通浏览器一样,事件 handler 会被自动传入一个 event 对象,这个对象和普通的浏览器 event 对象所包含的方法和属性都基本一致。不同的是 React 中的 event 对象并不是浏览器提供的,而是它自己内部所构建的。它同样具有 event . stoppropagation、event.preventDefault 这种常用的方法。
React 中事件处理的更多相关文章
- React 中阻止事件冒泡的问题
在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达 ...
- react中键盘enter事件处理
对于常见的搜索需求业务场景,用户输入完成后,点击enter事件请求数据,要求不提交页面,实现数据局部更新,这需要用到react中的表单Forms. 处理方法: (1)html书写 form标签中去掉a ...
- React中的事件处理为什么要bind this?
个人总结: 问: 请给我讲一下React中的事件处理为什么要bind this? 答: 好的,比如说我写了一个类组件,有个onClick属性 ,onClick={ this.fun },如果不bind ...
- react中回车enter事件处理
对于常见的搜索需求业务场景,用户输入完成后,点击enter事件请求数据,要求不提交页面,实现数据局部更新,这需要用到react中的表单Forms. 处理方法: (1)html书写 form标签中去掉a ...
- React中如何优雅的捕捉事件错误
React中如何优雅的捕捉事件错误 前话 人无完人,所以代码总会出错,出错并不可怕,关键是怎么处理. 我就想问问大家react的错误怎么捕捉呢? 这个时候: 小白:怎么处理? 小白+: ErrorBo ...
- React之事件处理
在react中,事件处理的写法和处理方式可能会和vue以及传统html有些不同. 一.事件名和默认行为阻止 事件名采用驼峰写法,并且方法名用大括号引入,而不是双引号: <button onCli ...
- 【Web技术】401- 在 React 中使用 Shadow DOM
本文作者:houfeng 1. Shadow DOM 是什么 Shadow DOM 是什么?我们先来打开 Chrome 的 DevTool,并在 'Settings -> Preferences ...
- React中的三大属性
一.前言: 属性1:state 属性2:props 属性3:ref 与事件处理 二.主要内容: 属性1:state 1,认识: 1) state 是组件对象中最重要的属性,值是一个对象(可以包含多个数 ...
- react的事件处理为什么要bind this 改变this的指向?
react的事件处理会丢失this,所以需要绑定,为什么会丢失this? 首先来看摘自官方的一句话: You have to be careful about the meaning of this ...
- React 中的函数式思想
函数式编程简要概念 函数式编程中一个核心概念之一就是纯函数,如果一个函数满足一下几个条件,就可以认为这个函数是纯函数了: 它是一个函数(废话): 当给定相同的输入(函数的参数)的时候,总是有相同的输出 ...
随机推荐
- MISC杂项解题思路
首先拿到一个杂项的附件 第一步要判断 是什么类型的杂项题目 附件是什么内容 是图片? 是压缩包? 是磁盘文件? 还是其他未知的东西 第一步的判断能够直接将解题思路精准定位到正确的区域下 加快解题速度 ...
- ctfshow--web入门--XXE
ctfshow--web入门--XXE web373 源码 <?php error_reporting(0); libxml_disable_entity_loader(false); //允许 ...
- [PWN之路]栈溢出那些事儿
前言 如果入门,想要学习栈溢出相关知识欢迎参考hash_hash的入门文章和我的集训wp,按照buuctf的题目一点一点做,不会的搜索到网上,并且及时在论坛发帖总结和交流.并且这里贴上一个不错的教程, ...
- N1nEmAn-2023集训wp
week1 2022-12-28 WP 0x00 T1 reverse3 前几天没注意到要发wp,现在补一下.最近在学汇编,pwn题没做新的了.想到之前了解到hws的pwn会考花指令,听hjx他们说那 ...
- BUUCTF-Youngter-drive 双线程的思考
拿到后先upx脱壳,然后直接进 从上向下看 应该是输入 慢慢看 明显的加密 这个函数大概是个加密 但是这个sleep函数是什么鬼??? 以下将拓展些许有关"线程"的概念: 一 ...
- WPF如何构建MVVM+模块化的桌面应用
为何模块化 模块化是一种分治思想,不仅可以分离复杂的业务逻辑,还可以进行不同任务的分工.模块与模块之间相互独立,从而构建一种松耦合的应用程序,便于开发和维护. 开发技术 .Net 6 + WPF + ...
- 1、MyBatis简介
1.1.MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁 移到了Google Code. ...
- VINS中旋转外参初始化
VINS 中的旋转外参初始化 为了使这个两个传感器融合,我们首先需要做的事情是将两个传感器的数据对齐,除了时间上的对齐,还有空间上的对齐.空间上的对齐通俗的讲就是将一个传感器获取的数据统一到另一个 ...
- uwsgi配置
编辑nginx配置: server { listen 8098; server_name 127.0.0.1; location / { include uwsgi_params; # uwsgi_p ...
- 小知识:调整OCI实例的时区
之前在随笔中<Linux (RHEL)修改时区> 介绍了时区修改方法. 默认OCI实例中,时区是GMT,在国内用看着这个时区就是很别扭的事情,于是修改时区,实测无需配置 /etc/sysc ...