文章目录

  • 注册事件
  • 事件处理函数中 this 问题
  • 事件传参
  • 获取事件对象

注册事件

React 元素的事件处理与 DOM 元素有些不同,React 通过事件绑定属性的方式注册事件时要采用驼峰式命名,其对应的属性值为一个函数而不是字符串。

示例:

import React from 'react'
import ReactDOM from 'react-dom'class Hello extends React.Component {render() {return (<div>{/* 驼峰命名,值为当前组件的相关函数 */}<button onClick={this.fun}>按钮</button></div>)}fun() {console.log('触发了点击事件!')}
}ReactDOM.render(<Hello />, document.getElementById('root'))

事件处理函数中 this 问题

在 React 中通过 class 创建的组件,其绑定的事件处理函数中的 this 值为 undefined,通常需要将事件处理函数中的 this 指向当前组件实例,介绍几种处理 this 指向的方法:

方法一:在调用事件处理函数时通过 bind() 方法手动去指定 this

import React from 'react'
import ReactDOM from 'react-dom'class Hello extends React.Component {render () {return (<div>{/* 通过 bind() 将 this 修改为当前实例 */}<button onClick={this.func.bind(this)}>this 指向1</button></div>)}func () {console.log('调用了 func()')console.log(this)}
}ReactDOM.render(<Hello />, document.getElementById('root'))


方法二:直接在构造器中修改事件处理函数的 this

import React from 'react'
import ReactDOM from 'react-dom'class Hello extends React.Component {constructor(props) {super()// 修改 thisthis.show= this.show.bind(this)}render () {return (<div><button onClick={this.func}>this指向</button></div>)}show() {console.log('调用了 show()')console.log(this)}
}ReactDOM.render(<Hello />, document.getElementById('root'))


方法三:通过属性初始化结合箭头函数定义事件处理函数(箭头函数没有自己的 this,箭头函数的this)

import React from 'react'
import ReactDOM from 'react-dom'class Hello extends React.Component {render () {return (<div><button onClick={this.say}>this指向</button></div>)}/* 属性初始化+箭头函数 */say = () => {console.log('调用了 say()')console.log(this)}
}ReactDOM.render(<Hello />, document.getElementById('root'))


方法四:将事件属性的值设为箭头函数,箭头函数中直接调用事件处理函数

import React from 'react'
import ReactDOM from 'react-dom'class Hello extends React.Component {render () {return (<div>{/* 箭头函数中直接调用 */}<button onClick={() => this.fun()}>this 指向</button></div>)}fun () {console.log('调用了 fun()')// 未指定时 this 为 undefinedconsole.log(this)}
}ReactDOM.render(<Hello />, document.getElementById('root'))

事件传参

方法一:通过 bind() 方法来进行传参,bind() 方法不仅可以修改 this 指向,还可以将后面的参数传递给被调用的目标函数。

bind() 语法:

fun.bind(thisArg[, arg1[, arg2[, ...]]])
  • arg1、arg2 传递给目标函数的参数

示例:

import React from 'react'
import ReactDOM from 'react-dom'class Hello extends React.Component {render () {return (<div>{/* 通过 bind() 向事件函数传参 */}<button onClick={this.show.bind(this, '大熊', '香香')}>按钮</button></div>)}show (arg, arg2) {console.log('调用了 show()')console.log(arg, arg2)}
}ReactDOM.render(<Hello />, document.getElementById('root'))


方法二:将事件属性的属性值设为箭头函数,在箭头函数中调用并传递参数。

import React from 'react'
import ReactDOM from 'react-dom'class Hello extends React.Component {render () {return (<div>{/* 方法二:将事件属性的属性值设为箭头函数,在箭头函数中调用并传递参数。 */}<button onClick={() => this.say('阿彬', '莲妹')}>按钮</button></div>)}say (arg, arg2) {console.log('调用了 say()')console.log(arg, arg2)}
}ReactDOM.render(<Hello />, document.getElementById('root'))

获取事件对象

方法一:不传参数时,事件处理函数默认第一个形参为事件对象

import React from 'react'
import ReactDOM from 'react-dom'class Hello extends React.Component {render () {return (<div>{/* 没有传参 */}<button onClick={this.fun}>按钮</button></div>)}// 第一个参数就是事件对象fun (e) {console.log(e)}
}ReactDOM.render(<Hello />, document.getElementById('root'))


方法二:通过属性初始化+箭头函数的方式(不传参)

import React from 'react'
import ReactDOM from 'react-dom'class Hello extends React.Component {render () {return (<div>{/* 没有传参 */}<button onClick={this.fun}>按钮</button></div>)}// 第一个参数就是事件对象fun = e => {console.log('调用了fun()')console.log(e)}
}ReactDOM.render(<Hello />, document.getElementById('root'))


方法三:在传参时可以通过 bind() 来获取事件对象;会默认事件处理函数的参数列表中后面未传值的那一个参数为事件对象。

import React from 'react'
import ReactDOM from 'react-dom'class Hello extends React.Component {render () {return (<div>{/* 传参时使用 bind() 获取事件对象 */}<button onClick={this.say.bind(this, '大兵')}>按钮</button></div>)}say (arg, arg2, arg3) {console.log('调用了 say()')// arg2 为事件对象console.log(arg, arg2)// arg3 为 undefinedconsole.log(arg3)}
}ReactDOM.render(<Hello />, document.getElementById('root'))

方法四:将事件属性的值设为箭头函数并定义形参(事件对象),在箭头函数中直接调用事件处理函数并接收事件对象。

import React from 'react'
import ReactDOM from 'react-dom'class Hello extends React.Component {render () {return (<div>{/* 使用箭头函数传递事件对象 */}<button onClick={(e) => this.show('大兵', e)}>按钮</button></div>)}/* 接收事件对象 */show (arg, arg2) {console.log('调用了 show()')console.log(arg, arg2)}
}ReactDOM.render(<Hello />, document.getElementById('root'))

React-注册事件相关推荐

  1. react的事件机制

    好久没写博客了,前段时间太忙以至于平时的积累都记录在内网的wiki里,趁着这几天有空,将这段时间所积累的干货慢慢的分享出来,如果内容有不正确的地方,欢迎纠正. 本博客大概介绍一下react的事件机制, ...

  2. React 合成事件

    文章借鉴 pingan8787 React合成事件 和 React合成事件官方文档 React 合成事件 一.概念介绍 React合成事件是React 模拟原生DOM事件所有能力 的一个事件对象. 根 ...

  3. 探究react的事件机制(合成事件)

    一.react的事件机制 react自身实现了一套事件机制,包括事件的注册.事件的存储.事件的合成及执行等. react 的所有事件并没有绑定到具体的dom节点上而是绑定在了document 上,然后 ...

  4. 探索React合成事件

    探索 React 合成事件 一.什么是合成事件 React 合成事件(SyntheticEvent)是 React 模拟原生 DOM 事件所有能力的一个事件对象,即浏览器原生事件的跨浏览器包装器.它根 ...

  5. react 八千字长文深入了解react合成事件底层原理,原生事件中阻止冒泡是否会阻塞合成事件?

    壹 ❀ 引 在前面两篇文章中,我们花了较大的篇幅介绍react的setState方法,在介绍setState同步异步时提到,在react合成事件中react对于this.state更新都是异步,但在原 ...

  6. react div onclick叠加_深入学习 React 合成事件

    翁斌斌,微医云前端工程师,在程序员的修炼道路上永不止步. 以下分析基于React, ReactDOM 16.13.1版本 提出问题 我们借鉴一个比较典型的案例开始来分析React事件 export 从 ...

  7. 【React源码】(十六)React 合成事件

    React 合成事件 概览 从v17.0.0开始, React 不会再将事件处理添加到 document 上, 而是将事件处理添加到渲染 React 树的根 DOM 容器中. 引入官方提供的图片: 图 ...

  8. props写法_好程序员web前端培训React中事件的写法总结

    好程序员web前端培训React中事件的写法总结,React的事件处理和DOM元素很相似,但是语法上是有不同的: 1.react事件采用驼峰命名法,而不是纯小写. 驼峰命名法(camelCase):命 ...

  9. React学习:事件绑定、组件定义、for、map循环-学习笔记

    文章目录 React学习:事件绑定.组件定义.for.map循环-学习笔记 事件绑定 组件定义 (参数传递) for.map循环 React学习:事件绑定.组件定义.for.map循环-学习笔记 事件 ...

  10. 【转】jquery 注册事件的方法

    原文链接:http://outofmemory.cn/code-snippet/2123/jquery-zhuce-event-method 1.使用事件名来绑定,可用的事件名有 change,cli ...

最新文章

  1. R语言进行主成分分析(PCA):使用prcomp函数来做主成分分析、使用summary函数查看主成分分析的结果、计算每个主成分解释方差的、每个主成分解释的方差的比例、以及多个主成分累积解释的方差比例
  2. php基础知识【oop/mvc/orm/aop】
  3. 用Kotlin开发android平台语音识别语义理解应用
  4. AndroidStudio-引用jar包及so文件
  5. 浏览器崩溃_如何在浏览器不崩溃的情况下过滤200万行数据?
  6. 计组之数据运算:2、奇偶校验码、海明校验码 循环冗余校验码
  7. otl_stream查询返回数据_Hive查询的18种方式,你都学会了吗?
  8. 一文搞定移动端适配!
  9. Dynatable – 基于 HTML5 jQuery 的交互表格插件
  10. ZUC加密算法实现-软件版本Java
  11. 如何看懂计算机英文文档,如何看英文技术文档
  12. Windows Server 2019系统Windows defender误删文件的解决办法
  13. flume1.8 TailDirSource断点续传与文件更名后数据重复采集的bug修复
  14. error converting to execution character set illegal byte sequence报错解决办法
  15. 【转】2023年Java学习路线图-黑马程序员
  16. mysql命令行进行数据导入和导出
  17. Pygame从0实战10(泡泡小游戏添加音效)
  18. 【实战】基于urllib.request登录爬取163邮箱
  19. 计算机桌面图标在地址栏,我的电脑地址栏不见了怎么办
  20. 计算机如何查看网络延时,电脑上怎么看网络丢包?网络延时查看方法

热门文章

  1. 小米6 刷LineageOS教程
  2. PyGame实现小游戏案例[小甲鱼 PlayTheBall]
  3. 计算机配件有没先后顺序,内存插槽是否有优先顺序?
  4. 单片机控制步进电机程序c语言正反转停止,51单片机步进电机正反转停止实验-C51源代码...
  5. 微信公众号图片上传和预览功能前端实现
  6. adb:设置手机屏幕亮度
  7. JDR与JRE的区别
  8. 51单片机最小系统及晶振电容的选择
  9. java经典算法(六)---zws
  10. win10操作系统上编译assimp库