React事件处理及事件流

2023-11-20

React事件处理

React事件处理是通过将事件处理器绑定到组建上处理事件,事件触发的同时更新组建的内部状态,内部状态更新会触发组件的重绘

React 元素的事件处理和 DOM 元素的事件处理很相似,但语法上的略有区别

  • 在React中事件的命名采用驼峰命名法,即事件名的首字母为大写,而不是原生DOM中的小写
  • 响应事件的函数要以对象的形式赋值,而不是以DOM字符串的形式

React方式

<button onClick={clickMe()}>提交</button>

DOM方式
<button onclick='clickMe()'>提交</button> dom方式

React中事件处理函数

在React中事件处理函数主要有三种写法,不同的写法this指向问题也不同,性能也有所差异

- ES6箭头函数

箭头函数适用于逻辑简单的事件,若逻辑复杂会导致render变得复杂,看不清UI的结构,代码可读性差

    <script type="text/babel">
        class Value extends React.Component{
            constructor(props){
                super(props);
                this.state = {
                    value:1
                }
            }
            render(){
                return(
                    <div>
                        <button onClick={(event)=>{console.log(this.state.value)}}>Click Me</button>
                    </div>
                )
            }
        }
        ReactDOM.render(<Value/>,document.getElementById('text'));
    </script>

按钮中绑定click事件里的this始终指向当前组件Value的实例

- 组件中定义事件函数

因为在自定义函数中this为null,若要在自定义函数中使用this,就必须进行绑定(将this强制绑定到自定义函数中)

    <div id="text"></div>
    <script type="text/babel">
        class MyComponent extends React.Component {
            constructor(props) {
                super(props);
                this.state = {
                    number: 0
                }
                // 因为自定义函数中this为null 所以要进行绑定
                this.handelClick = this.handelClick.bind(this)
            }
            // 事件处理函数
            handelClick(){
                this.state.number++;
                console.log(this.state.number)
            }
            render(){
                return (
                    <div>      
                    // 调用当前组件实例的事件处理函数                 
                        <button type='button' onClick={ this.handelClick }>点我</button>
                    </div>
                )
            }
        }
        ReactDOM.render(<MyComponent />, document.getElementById('text'))
    </script>

这种方法的好处是每次render渲染都不会重新创建一个回调函数,没有额外的性能损失,但是如果在一个组件中有很多的事件函数时这种在构造函数中绑定this的方法会显得繁琐

- 在事件赋值时绑定this

这个方法在每次render时都会重新创建一个新的函数,性能会有一定的损失,但在事件处理函数需要传参数时,这种方法就比较好

    <div id="text"></div>
    <script type="text/babel">
        class MyComponent extends React.Component {
            constructor(props) {
                super(props);
                this.state = {
                    number: 0
                }
            }
            handelClick(){
                ++this.state.number;
                console.log(this.state.number)
            }
            render(){
                return (
                    <div>            
                    // 在给事件赋值时绑定this          
                        <button type='button' onClick={ this.handelClick.bind(this) }>点我</button>
                    </div>
                )
            }
        }
        ReactDOM.render(<MyComponent />, document.getElementById('text'))
    </script>

关于this的绑定
在箭头函数中this指针指向组件的实例对象 不需要进行this绑定
在非箭头函数中若要使用this都必须进行绑定

事件流

react默认的事件流方式:冒泡

    <div id="app"></div>
    <script type="text/babel">
        const style = {
            child: {
                width: '100px',
                height: '100px',
                backgroundColor: 'red'
            },
            parent: {
                width: '150px',
                height: '150px',
                backgroundColor: '#bfa'
            },
            ancestor: {
                width: '200px',
                height: '200px',
                backgroundColor: 'green'
            }
        }
        class App extends React.Component{
            render(){
                return(
                    <div onClick={()=>console.log('ancestor')} style={style.ancestor}>
                        <div onClick={()=>console.log('parent')} style={style.parent}>
                            <div onClick={()=>console.log('child')} style={style.child}>
                            </div>    
                        </div>    
                    </div>
                )
            }
        }
        ReactDOM.render(<App />,document.getElementById('app'));

在这里插入图片描述

当点击红色区域也就是child 控制台输出依此是
在这里插入图片描述
若将事件的触发改为捕获方式,在事件后加Capture即可,若想阻止事件冒泡可以利用事件对象的stopPropagation()方法取消事件冒泡

							<div onClick={(e)=>{
                                console.log('child');
                                e.stopPropagation();
                            }} 
                            style={style.child}>
                            </div>

此时点击红色区域后控制台只输出child说明阻止冒泡成功

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React事件处理及事件流 的相关文章

  • 设置相机角度react-三纤

    如何使用将相机指向场景中的某个方向react three fiber canvas 元素有一个相机道具 但它不提供设置角度的方法
  • Nest.js Google Login(passport.js) 与 SPA 前端(React)

    在我的全栈项目 Nest js React 中 我使用护照谷歌实现了谷歌登录 如下所示 import Controller Get Req UseGuards from nestjs common import AppService fro
  • React PropTypes:数字范围

    有没有更好的方法来验证如果数字在范围内 避免写作 PropTypes oneOf 1 2 3 4 5 6 7 8 9 10 根据文档 https reactjs org docs typechecking with proptypes ht
  • 使用 Highcharts 和 React 创建条形图 - 出现未找到渲染 div 的错误

    我正在尝试在我的 Web 应用程序中使用 Highcharts 创建条形图 该应用程序在前端使用 React 下面是我的仪表板 tsx 文件的片段 我基本上只是从 JSFiddle 复制并粘贴了代码 http jsfiddle net 8q
  • 如何将文件从 ReactJS 上传到 Express 端点

    在我当前正在开发的应用程序中 有几个文件表单是通过以下方式提交的superagent到 Express API 端点 例如 图像数据的发布方式如下 handleSubmit function evt var imageData new Fo
  • 带 webusb 的指纹扫描仪

    可以将 USB 指纹扫描仪与 webusb 连接 配对 https wicg github io webusb https wicg github io webusb 我有数字角色 U are U 4500 想要使用react js 连接到
  • 如何从反应上下文中获取数据

    我有一个名为的 React 类GlobalDataProvider import React Component from react const DataContext React createContext export default
  • 在 React 中使用“ref”作为数组

    当我尝试使用 Redux 在 React 中将输入引用为数组时 我遇到了一些问题 下面的代码将数组中的每一篇文章映射一个面板 var articles this props item array articles map article i
  • CSS 100% 高度在 React 应用程序中不起作用

    我试图在我的 React 应用程序中使用 Flexbox 创建一个简单的两列网页 占据整个宽度和高度 我可以让它单独使用 HTML 和 CSS 但不能在 React 应用程序中使用 到目前为止我有 root overflow x hidde
  • 在 Storybook 中隐藏每个故事的插件

    我正在使用 Storybook 和 React 构建一个组件库 使用 CSF 方法包含故事 我有多个插件 并在显示单个故事时使用它们 我还在一个视图中一起显示所有故事 作为参考 我想禁用特定插件的就是这个故事 在这种情况下 我想禁用旋钮 当
  • ReactJS Mapbox-gl 无效类型:“容器”必须是字符串或 HTMLElement

    我正在使用 ReactJS 和 Mapbox GL JS 构建一个小型应用程序 const MapRender gt const mapContainerRef useRef null const map new mapboxgl Map
  • 使用单个 shell 脚本运行 React 和 Flask

    我构建了一个使用 ReactJS 作为前端和 Flask 作为中间件的应用程序 我可以使用以下命令序列来执行它 npm start cd Equation Solver python m flask run 执行第一个命令后 我必须打开另一
  • 根据 ID 更新 React.js 中的特定组件实例

    在react js应用程序中 我想知道为每个组件提供一个ID的最佳实践是什么 该ID可用于根据需要仅更新该组件的信息 例如 如果我们有一个显示销售信息的组件 并且我们创建并显示其中 20 个组件 因为我们有 20 个产品 那么我们会每隔一段
  • 如何在Vite配置中更改antd主题?

    是一个由Vite和React antd组成的项目 我想在 vite config ts 中动态处理 antd 主题 如果您能告诉我如何修改 React 组件中的 less modifyVars 值 我将不胜感激 这是当前屏幕 光状态 htt
  • 我们如何调用react-navigation中的特定类型的action?

    如何使用 NavigationAction 调用操作 如果用户没有令牌 则会返回初始页面 我想重置 初始化 MainTabNavigator componentWillReceiveProps nextProps if nextProps
  • 获取:使用获取响应设置变量并从函数返回[重复]

    这个问题在这里已经有答案了 我对 JavaScript 和 React 还很陌生 我有一个来自组件的回调 该组件从给定 id 的服务器获取 customer name 提取工作正常 console log 正确打印全名 但最后一个 then
  • 如何正确模拟 i18next

    这是我的函数和测试的简化版本 虽然我嘲笑了 useTranslation 我收到以下错误 您正在传递一个未定义的模块 请检查您的对象 传递给 i18next use 7 i18n 8 use Backend gt 9 use initRea
  • 如何等待在react.js中渲染视图直到$.get()完成?

    您好 我正在用 Reactjs 编写一个聊天客户端 并希望使用从 REST 调用检索到的数据来渲染我的组件 但是 我的组件是在 REST 请求返回数据之前渲染的 当我在我的子组件中调用 this props 时 这会导致错误 var Mai
  • 将 chrome api 与 React.js 结合使用

    我一直在尝试使用 React 制作一个简单的 Chrome 扩展 清单看起来像这样 name New Tab version 1 0 manifest version 2 description A minimalist replaceme
  • 在反应中将索引从一个函数传递到另一个函数

    我有一个项目列表 单击删除按钮后该项目将被删除 我知道执行此操作的步骤 但我不知道如何将密钥传递到 dlt item 范围 http jsfiddle net 3Ley7uac 1 http jsfiddle net 3Ley7uac 1

随机推荐

  • Java 之 认识String类

    目录 一 String类的重要性 二 常用方法 1 字符串构造 2 String对象的比较 3 字符串查找 4 转化 5 字符串替换 6 字符串拆分 7 字符串截取 8 其他操作方法 9 字符串的不可变性 10 字符串修改 三 String
  • 《动手学深度学习 Pytorch版》 2.7 查阅文档

    2 7 1 查找模块中的所有函数和类 import torch 可以调用 dir 函数查询函数中有哪些模块和类 以 双下划线 开始和结束的函数是 Python 中的特殊对象 以 单下划线 开始的函数是内部函数 通常以上两种函数可以忽略 di
  • 如何下载英伟达NVIDIA旧版本驱动,旧版本驱动官方网址

    https www nvidia cn Download Find aspx lang cn 也可以直接搜索英伟达官网 点击驱动程序 然后点击试用版驱动程序 里面不但有试用版的驱动 还有之前发布的所有驱动
  • 2023年信息素养大赛智能算法挑战复赛初中组

    智能算法挑战复赛初中组 总共 4 道题 1 修复机器人的对话词库错误 题目描述 基于人工智能技
  • 深度学习模型参数量/计算量(附计算代码)

    参考 https mp weixin qq com s biz MzI4MDYzNzg4Mw mid 2247546551 idx 2 sn f198b6365e11f0a18832ff1203302632 chksm ebb70e63dc
  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • 【FPGA多周期时序约束详解】- 解读FPGA多周期时序约束的全过程

    FPGA多周期时序约束详解 解读FPGA多周期时序约束的全过程 FPGA作为数字电路设计的常见工具 其设计中必然会遇到时序约束的问题 而多周期时序约束更是FPGA设计中不可避免的难点之一 本文将详细介绍FPGA多周期时序约束的全过程 并结合
  • PHP 使用 Kafka 安装拾遗

    最近项目开发中需要使用 Kafka 消息队列 经过检索 PHP下面有通用的两种方式来调用 Kafka php rdkafka 扩展 以 PHP 扩展的形式进行使用是非常高效的 另外 该项目也提供了非常完备的 文档 不过在 Mac 环境中安装
  • Android9 默认开启/关闭GPS

    gps默认打开 需要关闭的话 修改以下文件 frameworks base packages SettingsProvider res values defaults xml 将
  • xp系统蓝屏,xp系统蓝屏的详细解决过程

    xp系统蓝屏的详细解决过程 现在XP系统微软停止开发了 服务也升级不得了 刚刚使用时还是好好的 能够正常的运行 怎么一言不合就蓝屏了呢 那么xp蓝屏怎么办呢 跟你们分享一下小编解决xp蓝屏的经验吧 重新启动 快速按F8 用箭头上下选择 最后
  • 2022VLMo: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts

    摘要 我们提出了一个统一的视觉 语言预训练模型 VLMo 该模型与一个模块化的transformer网络共同学习一个双编码器和一个融合编码器 具体地 我们引入了模态混合专家 MoME Transformer 其中每个块包含一个特定于模态的专
  • tensorRT部署之 代码实现 onnx转engine/trt模型

    tensorRT部署之 代码实现 onnx转engine trt模型 前提已经装好显卡驱动 cuda cudnn 以及tensorRT 下面将给出Python C 两种转换方式 1 C 实现 项目属性配置好CUDA tensoeRT库 通常
  • 吴恩达机器学习笔记系列(五)——梯度下降

    一 gradient descent 梯度下降 1 概念 线性回归的目的就是找出使得误差 损失函数 最小的参数值 可以用梯度下降来确定 参数的大小 梯度下降是一种迭代方法 能够求解局部最小值 结果与初始点的选取有关 为了找到最小值 从某一点
  • ADFS 4.0 证书更新

    ADFS 4 0 证书更新 由于公网证书的过期 需要重新更新ADFS的服务通信证书 证书要求 带私钥 PFX格式 更换流程 证书安装到 证书 计算机 个人 安装后点开证书能看到 你有一个与证书对应的私钥 右击证书 gt 所有任务 gt 管理
  • 【uboot内核适配学习】uboot 修改默认ip

    1 修改默认ip作用 设备出场的时候都需要默认的ip 2 修改措施 找到uboot芯片配置文件 不同芯片厂家适配的文件必定是不一样的 位置也可能不一样 define CONFIG ETHADDR 00 40 5c 26 0a 5b MAC地
  • 面经——小米面经(2021春招)

    摘自 小米面经 2021春招 感谢小米 感谢雷总 感谢上官可编程 作者 阿波罗啦啦啦啦 发布时间 2021 05 01 11 08 41 网址 https blog csdn net weixin 44933419 article deta
  • 博客营销

    1 博客营销有什么价值 应注意什么 1 博客可以直接带来潜在用户 2 博客营销的价值体现在降低网站推广费用方面 3 博客文章内容为用户通过搜索引擎获取信息提供了机会 4 博客文章可以方便地增加企业网站的链接数量 5 可以实现更低的成本对读者
  • 指标体系建设

    1 背景 结合业务场景将多个不同指标和维度进行组合 从而针对某一真实业务场景进行数据分析和决策导向 并能在整体业务变化中发现和定位问题 2 概念理解与示例分析 2 1 指标体系 指标体系 名称 分类 解析 作用 示例 指标 结果型指标 时机
  • 汉诺塔问题 java

    汉诺塔问题 public class HanoiTower 编写一个main方法 public static void main String args Tower t1 new Tower t1 move 5 A B C 汉诺塔问题的解决
  • React事件处理及事件流

    React事件处理 React事件处理是通过将事件处理器绑定到组建上处理事件 事件触发的同时更新组建的内部状态 内部状态更新会触发组件的重绘 React 元素的事件处理和 DOM 元素的事件处理很相似 但语法上的略有区别 在React中事件